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动态生成虚拟现实VRML网页
Oct 09 PHP
使用php重新实现PHP脚本引擎内置函数
Mar 06 PHP
PHP XML备份Mysql数据库
May 27 PHP
php下关于中英数字混排的字符串分割问题
Apr 06 PHP
Linux下实现PHP多进程的方法分享
Aug 16 PHP
PHP数字和字符串ID互转函数(类似优酷ID)
Jun 30 PHP
修复ShopNC使用QQ 互联时提示100010 错误
Nov 08 PHP
PHP数据库操作Helper类完整实例
May 11 PHP
利用PHP生成CSV文件简单示例
Dec 21 PHP
phpstudy默认不支持64位php的解决方法
Feb 20 PHP
深入理解PHP中mt_rand()随机数的安全
Oct 12 PHP
PHP高并发和大流量解决方案整理
Mar 09 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
PHP pathinfo()获得文件的路径、名称等信息说明
2011/09/13 PHP
PHP代码网站如何防范SQL注入漏洞攻击建议分享
2012/03/01 PHP
jquery 子窗口操作父窗口的代码
2009/09/21 Javascript
JavaScript DOM 学习第九章 选取范围的介绍
2010/02/19 Javascript
extjs 的权限问题 要求控制的对象是 菜单,按钮,URL
2010/03/09 Javascript
JavaScript中switch判断容易犯错的一个细节
2014/08/27 Javascript
jquery禁止回车触发表单提交
2014/12/12 Javascript
浅析Node.js的Stream模块中的Readable对象
2015/07/29 Javascript
JavaScript继承模式粗探
2016/01/12 Javascript
AngularJS基础 ng-cloak 指令简单示例
2016/08/01 Javascript
JavaScript制作简单分页插件
2016/09/11 Javascript
jQuery上传多张图片带进度条样式(DEMO)
2017/03/02 Javascript
vue如何从接口请求数据
2017/06/22 Javascript
jQuery中复合选择器简单用法示例
2018/03/31 jQuery
基于jQuery ztree实现表格风格的树状结构
2018/08/31 jQuery
axios 封装上传文件的请求方法
2018/09/26 Javascript
js实现json数组分组合并操作示例
2019/02/12 Javascript
解决Vue+Electron下Vuex的Dispatch没有效果问题
2019/05/20 Javascript
jQuery子选择器与可见性选择器实例分析
2019/06/28 jQuery
python实现基本进制转换的方法
2015/07/11 Python
利用Celery实现Django博客PV统计功能详解
2017/05/08 Python
详解Python读取配置文件模块ConfigParser
2017/05/11 Python
你眼中的Python大牛 应该都有这份书单
2017/10/31 Python
python 获取url中的参数列表实例
2018/12/18 Python
python+pyqt5编写md5生成器
2019/03/18 Python
python读取图片的几种方式及图像宽和高的存储顺序
2020/02/11 Python
Sasa莎莎海外旗舰店:香港莎莎美妆平台
2018/03/21 全球购物
Booking.com德国:预订最好的酒店和住宿
2020/02/16 全球购物
高一生物教学反思
2014/01/17 职场文书
学生操行评语大全
2014/04/24 职场文书
学校节能宣传周活动总结
2014/07/09 职场文书
活动经费申请报告
2015/05/15 职场文书
2015年国庆节演讲稿范文
2015/07/30 职场文书
python plt.plot bar 如何设置绘图尺寸大小
2021/06/01 Python
Mysql中调试存储过程最简单的方法
2021/06/30 MySQL
Spring Data JPA框架Repository自定义实现
2022/04/28 Java/Android