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去除数组中重复的元素并按键名排序函数
Aug 18 PHP
php摘要生成函数(无乱码)
Feb 04 PHP
php中hashtable实现示例分享
Feb 13 PHP
php获取域名的google收录示例
Mar 24 PHP
php验证是否是md5编码的简单代码
Apr 01 PHP
php实现图片局部打马赛克的方法
Feb 11 PHP
PHP中使用Memache作为进程锁的操作类分享
Mar 30 PHP
详解PHP中的状态模式编程
Aug 11 PHP
php多文件打包下载的实例代码
Jul 12 PHP
tp5实现微信小程序多图片上传到服务器功能
Jul 16 PHP
laravel 框架结合关联查询 when()用法分析
Nov 22 PHP
php实现简单四则运算器
Nov 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
国内php原创论坛
2006/10/09 PHP
PHP 查找字符串常用函数介绍
2012/06/07 PHP
laravel excel 上传文件保存到本地服务器功能
2019/11/14 PHP
基于jquery实现一张图片点击鼠标放大再点缩小
2013/09/29 Javascript
Js实现当前点击a标签变色突出显示其他a标签回复原色
2013/11/27 Javascript
jquery实现的用户注册表单提示操作效果代码分享
2015/08/28 Javascript
d3.js实现简单的网络拓扑图实例代码
2016/11/06 Javascript
AngularJS 验证码60秒倒计时功能的实现
2017/06/05 Javascript
前端必备插件之纯原生JS的瀑布流插件Macy.js
2017/11/22 Javascript
浅谈 vue 中的 watcher
2017/12/04 Javascript
WebPack配置vue多页面的技巧
2018/05/15 Javascript
Vue路由前后端设计总结
2019/08/06 Javascript
vue请求服务器数据后绑定不上的解决方法
2019/10/30 Javascript
vuex实现数据状态持久化
2019/11/11 Javascript
BootStrap前端框架使用方法详解
2020/02/26 Javascript
JavaScript arguments.callee作用及替换方案详解
2020/09/02 Javascript
vue绑定class的三种方法
2020/12/24 Vue.js
[15:23]教你分分钟做大人:虚空假面
2014/10/30 DOTA
详解python实现小波变换的一个简单例子
2019/07/18 Python
python实现实时视频流播放代码实例
2020/01/11 Python
tensorflow使用freeze_graph.py将ckpt转为pb文件的方法
2020/04/22 Python
Python中操作各种多媒体,视频、音频到图片的代码详解
2020/06/04 Python
推荐10个HTML5响应式框架
2016/02/25 HTML / CSS
DKNY品牌官网:纽约大都会时尚风格
2016/10/20 全球购物
德国机场停车位比较和预订网站:Ich-parke-billiger
2018/01/08 全球购物
Java面试中常遇到的问题,也是需要注意的几点
2013/08/30 面试题
在职人员函授期间自我评价分享
2013/11/08 职场文书
好军嫂事迹材料
2014/01/15 职场文书
2014社区三八妇女节活动总结
2014/03/01 职场文书
2014全国两会学习心得体会2000字
2014/03/10 职场文书
捐赠仪式主持词
2014/03/19 职场文书
留学顾问岗位职责
2014/04/14 职场文书
师范毕业生求职信
2014/07/11 职场文书
演讲开场白和结束语
2015/05/29 职场文书
2016计算机专业毕业生自荐信
2016/01/28 职场文书
MySQL 时间类型的选择
2021/06/05 MySQL