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 相关文章推荐
用windows下编译过的eAccelerator for PHP 5.1.6实现php加速的使用方法
Sep 30 PHP
在PHP中使用模板的方法
May 24 PHP
PHP 递归效率分析
Nov 24 PHP
PHP下常用正则表达式整理
Oct 26 PHP
基于HBase Thrift接口的一些使用问题及相关注意事项的详解
Jun 03 PHP
PHP实现图片旋转效果实例代码
Oct 01 PHP
PHP中empty和isset对于参数结构的判断及empty()和isset()的区别
Nov 15 PHP
php脚本运行时的超时机制详解
Feb 17 PHP
Zend Framework入门教程之Zend_Db数据库操作详解
Dec 08 PHP
PHP计算近1年的所有月份
Mar 13 PHP
解决form中action属性后面?传递参数 获取不到的问题
Jul 21 PHP
通过源码解析Laravel的依赖注入
Jan 22 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 jquery 实现新闻标签分类与无刷新分页
2009/12/18 PHP
PHP连接SQLServer2005的实现方法(附ntwdblib.dll下载)
2012/07/02 PHP
PHPThumb图片处理实例
2014/05/03 PHP
PHP实现发送邮件的方法(基于简单邮件发送类)
2015/12/17 PHP
PHP htmlspecialchars_decode()函数用法讲解
2019/03/01 PHP
jquery URL参数判断,确定菜单样式
2010/05/31 Javascript
基于jquery的让textarea自适应高度的插件
2010/08/03 Javascript
基于mootools 1.3框架下的图片滑动效果代码
2011/04/22 Javascript
映彩衣的js随笔(js图片切换效果)
2011/07/31 Javascript
js控制表单奇偶行样式的简单方法
2013/07/31 Javascript
JS获取当前网址、主机地址项目根路径
2013/11/19 Javascript
JavaScript获取当前页面上的指定对象示例代码
2014/02/28 Javascript
AngularJs concepts详解及示例代码
2016/09/01 Javascript
基于Bootstrap 3 JQuery及RegExp的表单验证功能
2017/02/16 Javascript
浅析bootstrap原理及优缺点
2017/03/19 Javascript
带你快速理解javascript中的事件模型
2017/08/14 Javascript
深入浅析Vue中的Prop
2018/06/10 Javascript
详解Vue CLI 3.0脚手架如何mock数据
2018/11/23 Javascript
Vue在H5 项目中使用融云进行实时个人单聊通讯
2020/12/14 Vue.js
[01:10:48]完美世界DOTA2联赛PWL S2 GXR vs PXG 第一场 11.18
2020/11/18 DOTA
Python Pandas 对列/行进行选择,增加,删除操作
2020/05/17 Python
全球虚拟主机商:HostGator
2017/02/06 全球购物
美国环保妈妈、儿童和婴儿用品购物网站:The Tot
2019/11/24 全球购物
Clos19英国:高档香槟、葡萄酒和烈酒在线购物平台
2020/07/10 全球购物
药品质量检测应届生求职信
2013/11/14 职场文书
公司行政经理岗位职责
2013/12/24 职场文书
初中科学教学反思
2014/01/21 职场文书
交通事故检查书范文
2014/01/30 职场文书
创新型城市实施方案
2014/03/06 职场文书
关工委先进个人事迹材料
2014/05/23 职场文书
2014学习优秀共产党员先进事迹思想汇报
2014/09/14 职场文书
大学生自我评价范文
2015/03/03 职场文书
2015年扶贫帮困工作总结
2015/05/20 职场文书
写自招自荐信的绝招!
2019/04/19 职场文书
goland 恢复已更改文件的操作
2021/04/28 Golang
Matplotlib绘制混淆矩阵的实现
2021/05/27 Python