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 相关文章推荐
用Socket发送电子邮件
Oct 09 PHP
php 不同编码下的字符串长度区分
Sep 26 PHP
用PHP实现的四则运算表达式计算实现代码
Aug 02 PHP
利用php绘制饼状图的实现代码
Jun 07 PHP
PHP与javascript实现变量交互的示例代码
Jul 23 PHP
php配合jquery实现增删操作具体实例
Dec 12 PHP
Yii实现自动加载类地图的方法
Apr 01 PHP
PHP实现全角字符转为半角方法汇总
Jul 09 PHP
php 生成加密公钥加密私钥实例详解
Jun 16 PHP
yii框架redis结合php实现秒杀效果(实例代码)
Oct 26 PHP
PHP简单实现欧拉函数Euler功能示例
Nov 06 PHP
thinkPHP5框架实现基于ajax的分页功能示例
Jun 12 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设计模式之单例模式原理与实现方法分析
2018/04/25 PHP
CI框架(CodeIgniter)实现的导入、导出数据操作示例
2018/05/24 PHP
PHP7匿名类的用法示例
2019/04/05 PHP
详解如何实现Laravel的服务容器的方法示例
2019/04/15 PHP
php 多进程编程父进程的阻塞与非阻塞实例分析
2020/02/22 PHP
Javascript 原型和继承(Prototypes and Inheritance)
2009/04/01 Javascript
js href的用法
2010/05/13 Javascript
Dom 是什么的详细说明
2010/10/25 Javascript
jquery插件制作 表单验证实现代码
2012/08/17 Javascript
使用jquery 简单实现下拉菜单
2015/01/14 Javascript
浅谈EasyUI中编辑treegrid的方法
2015/03/01 Javascript
理解javascript中的MVC模式
2016/01/28 Javascript
jQuery获取当前点击的对象元素(实现代码)
2016/05/19 Javascript
一个非常好用的文字滚动的案例,鼠标悬浮可暂停[两种方案任选]
2016/12/01 Javascript
nuxt.js 缓存实践
2018/06/25 Javascript
解决vue接口数据赋值给data没有反应的问题
2018/08/27 Javascript
webuploader分片上传的实现代码(前后端分离)
2018/09/10 Javascript
在Vue中使用icon 字体图标的方法
2019/06/14 Javascript
Node.js API详解之 tty功能与用法实例分析
2020/04/27 Javascript
jQuery实现简单日历效果
2020/07/05 jQuery
基于vue+element实现全局loading过程详解
2020/07/10 Javascript
[52:06]FNATIC vs NIP 2019国际邀请赛小组赛 BO2 第二场 8.16
2019/08/19 DOTA
[01:10:48]完美世界DOTA2联赛PWL S2 GXR vs PXG 第一场 11.18
2020/11/18 DOTA
Python使用Selenium+BeautifulSoup爬取淘宝搜索页
2018/02/24 Python
在PyCharm中实现关闭一个死循环程序的方法
2018/11/29 Python
CSS3教程(3):border-color网页边框色彩
2009/04/02 HTML / CSS
css3 media 响应式布局的简单实例
2016/08/03 HTML / CSS
20佳惊艳的HTML5应用程序示例分享
2011/05/03 HTML / CSS
Nike英国官网:Nike.com (UK)
2017/02/13 全球购物
国际商务系学生个人的自我评价
2013/11/26 职场文书
农民工创业典型事迹
2014/01/25 职场文书
企业贷款委托书格式
2014/09/12 职场文书
2015年营业员工作总结
2015/04/23 职场文书
总经理致辞
2015/07/29 职场文书
nginx之queue的具体使用
2022/06/28 Servers
蓝牙耳机怎么连接电脑win11? Win11蓝牙耳机连接电脑的技巧
2023/01/09 数码科技