PHP5 面向对象程序设计


Posted in PHP onFebruary 13, 2008

PHP5有一个单重继承的,限制访问的,可以重载的对象模型. 本章稍后会详细讨论的”继承”,包含类间的父-子关系. 另外,PHP支持对属性和方法的限制性访问. 你可以声明成员为private,不允许外部类访问. 最后,PHP允许一个子类从它的父类中重载成员.

PHP5的对象模型把对象看成与任何其它数据类型不同,通过引用来传递. PHP不要求你通过引用(reference)显性传递和返回对象. 在本章的最后将会详细阐述基于引用的对象模型. 它是PHP5中最重要的新特性.

有了更直接的对象模型,就拥有了附加的优势: 效率提高, 占用内存少,并且具有更大的灵活性.

在PHP的前几个版本中,脚本默认复制对象.现在PHP5只移动句柄,需要更少的时间. 脚本执行效率的提升是由于避免了不必要的复制. 在对象体系带来复杂性的同时,也带来了执行效率上的收益. 同时,减少复制意味着占用更少的内存,可以留出更多内存给其它操作,这也使效率提高.

Zand引擎2具有更大的灵活性. 一个令人高兴的发展是允许析构--在对象销毁之前执行一个类方法. 这对于利用内存也很有好处,让PHP清楚地知道什么时候没有对象的引用,把空出的内存分配到其它用途. 

补充:

PHP5的内存管理

对象传递

 

PHP5使用了Zend引擎II,对象被储存于独立的结构Object Store中,而不像其它一般变量那样储存于Zval中(在PHP4中对象和一般变量一样存储于Zval)。在Zval中仅存储对象的指针而不是内容(value)。当我们复制一个对象或者将一个对象当作参数传递给一个函数时,我们不需要复制数据。仅仅保持相同的对象指针并由另一个zval通知现在这个特定的对象指向的Object Store。由于对象本身位于Object Store,我们对它所作的任何改变将影响到所有持有该对象指针的zval结构----表现在程序中就是目标对象的任何改变都会影响到源对象。.这使PHP对象看起来就像总是通过引用(reference)来传递,因此PHP中对象默认为通过“引用”传递,你不再需要像在PHP4中那样使用&来声明。

 

垃圾回收机制

某些语言,最典型的如C,需要你显式地要求分配内存当你创建数据结构。一旦你分配到内存,就可以在变量中存储信息。同时你也需要在结束使用变量时释放内存,这使机器可以空出内存给其它变量,避免耗光内存。

PHP可以自动进行内存管理,清除不再需要的对象。PHP使用了引用计数(reference counting)这种单纯的垃圾回收(garbage collection)机制。每个对象都内含一个引用计数器,每个reference连接到对象,计数器加1。当reference离开生存空间或被设为NULL,计数器减1。当某个对象的引用计数器为零时,PHP知道你将不再需要使用这个对象,释放其所占的内存空间。

例如:

<?php   
class Person{   
}   
function sendEmailTo(){   
}   $haohappy = new Person( );     
// 建立一个新对象:  引用计数    Reference count = 1   
$haohappy2 = $haohappy;         
// 通过引用复制:  Reference count = 2   
unset($haohappy);             
// 删除一个引用: Reference count = 1   
sendEmailTo($haohappy2);        
// 通过引用传递对象:     
// 在函数执行期间:   
//  Reference count = 2   
// 执行结束后:   
// Reference count = 1   
unset($haohappy2);             
// 删除引用: Reference count = 0 自动释放内存空间   
?> 

PHP 相关文章推荐
PHP MYSQL乱码问题,使用SET NAMES utf8校正
Nov 30 PHP
php获取mysql数据库中的所有表名的代码
Apr 23 PHP
PHP中数组定义的几种方法
Sep 01 PHP
ThinkPHP页面跳转success与error方法概述
Jun 25 PHP
用 Composer构建自己的 PHP 框架之使用 ORM
Oct 30 PHP
php判断linux下程序问题实例
Jul 09 PHP
非常经典的PHP文件上传类分享
May 15 PHP
php字符串操作常见问题小结
Oct 11 PHP
关于PHP内置的字符串处理函数详解
Feb 04 PHP
php 三大特点:封装,继承,多态
Feb 19 PHP
thinkphp5.0整合phpsocketio完整攻略(绕坑)
Oct 12 PHP
thinkphp框架无限级栏目的排序功能实现方法示例
Mar 29 PHP
Dedecms常用函数解析
Feb 01 #PHP
用php实现批量查询清除一句话后门的代码
Jan 20 #PHP
asp和php下textarea提交大量数据发生丢失的解决方法
Jan 20 #PHP
php开发工具之vs2005图解
Jan 12 #PHP
java EJB 加密与解密原理的一个例子
Jan 11 #PHP
apache rewrite_module模块使用教程
Jan 10 #PHP
支持php4、php5的mysql数据库操作类
Jan 10 #PHP
You might like
打造计数器DIY三步曲(下)
2006/10/09 PHP
IIS6.0+PHP5.x+MySQL5.x+Zend3.0x+GD+phpMyAdmin2.8x通用安装实例(已经完成)
2006/12/06 PHP
php异步多线程swoole用法实例
2014/11/14 PHP
PHP使用反向Ajax技术实现在线客服系统详解
2019/07/01 PHP
TP5框架实现自定义分页样式的方法示例
2020/04/05 PHP
js 图片缩放(按比例)控制代码
2009/05/27 Javascript
JQuery插件fancybox无法在弹出层使用左右键的解决办法
2013/12/25 Javascript
JavaScript Promise启示录
2014/08/12 Javascript
JS实现超简单的仿QQ折叠菜单效果
2015/09/21 Javascript
JS实现新浪博客左侧的Blog管理菜单效果代码
2015/10/22 Javascript
js实现对ajax请求面向对象的封装
2016/01/08 Javascript
javascript对浅拷贝和深拷贝的详解
2016/10/14 Javascript
原生JS查找元素的方法(推荐)
2016/11/22 Javascript
通过源码分析Vue的双向数据绑定详解
2017/09/24 Javascript
对node.js中render和send的用法详解
2018/05/14 Javascript
vue项目部署上线遇到的问题及解决方法
2018/06/10 Javascript
JavaScript常用事件介绍
2019/01/21 Javascript
wepy--用vantUI 实现上弹列表并选择相应的值操作
2020/11/03 Javascript
Flexible.js可伸缩布局实现方法详解
2020/11/13 Javascript
python连接mongodb操作数据示例(mongodb数据库配置类)
2013/12/31 Python
Python网络爬虫项目:内容提取器的定义
2016/10/25 Python
利用Python爬取微博数据生成词云图片实例代码
2017/08/31 Python
Python3.6基于正则实现的计算器示例【无优化简单注释版】
2018/06/14 Python
Python学习笔记之While循环用法分析
2019/08/14 Python
使用python实现多维数据降维操作
2020/02/24 Python
Pytorch 图像变换函数集合小结
2021/02/01 Python
python解决OpenCV在读取显示图片的时候闪退的问题
2021/02/23 Python
详解CSS透明opacity和IE各版本透明度滤镜filter的最准确用法
2016/12/20 HTML / CSS
香港草莓网土耳其网站:Strawberrynet TR
2017/03/02 全球购物
英国最大的在线快递公司之一:ParcelHero
2019/11/04 全球购物
医院护士求职自荐信格式
2013/09/21 职场文书
兼职业务员岗位职责
2014/01/01 职场文书
《世界多美呀》教学反思
2014/03/02 职场文书
团日活动总结书
2014/05/08 职场文书
先进个人主要事迹范文
2015/11/04 职场文书
postgreSQL数据库基础知识介绍
2022/04/12 PostgreSQL