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 中执行系统外部命令
Oct 09 PHP
php 过滤危险html代码
Jun 29 PHP
php中使用PHPExcel读写excel(xls)文件的方法
Sep 15 PHP
初识PHP
Sep 28 PHP
利用PHP函数计算中英文字符串长度的方法
Nov 11 PHP
PHP中使用hidef扩展代替define提高性能
Apr 09 PHP
PHP获取二维数组中某一列的值集合
Dec 25 PHP
PHP常用的三种设计模式汇总
Aug 28 PHP
PHP+Mysql无刷新问答评论系统(源码)
Dec 20 PHP
Yii2 queue的队列使用详解
Jul 19 PHP
Laravel框架Auth用户认证操作实例分析
Sep 29 PHP
laravel添加前台跳转成功页面示例
Oct 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
preg_match_all使用心得分享
2014/01/31 PHP
PHP独立Session数据库存储操作类分享
2014/06/11 PHP
Ubuntu server 11.04安装memcache及php使用memcache来存储session的方法
2016/05/31 PHP
PHP水印类,支持添加图片、文字、填充颜色区域的实现
2017/02/04 PHP
PHP命名空间namespace的定义方法详解
2017/03/29 PHP
php动态读取数据清除最右边距的方法
2017/04/12 PHP
php 查找数组元素提高效率的方法详解
2017/05/05 PHP
一个可拖拽列宽表格实例演示
2012/11/26 Javascript
Knockout数组(observable)使用详解示例
2013/11/15 Javascript
javascript实现动态加载CSS
2015/01/26 Javascript
JavaScript里实用的原生API汇总
2015/05/14 Javascript
javascript制作幻灯片(360度全景图片)
2015/07/28 Javascript
Three.js基础部分学习
2017/01/08 Javascript
JS中如何实现Laravel的route函数详解
2017/02/12 Javascript
详谈js遍历集合(Array,Map,Set)
2017/04/06 Javascript
Angular路由ui-router配置详解
2018/08/01 Javascript
详解python--模拟轮盘抽奖游戏
2019/04/12 Python
Python3日期与时间戳转换的几种方法详解
2019/06/04 Python
Python基于机器学习方法实现的电影推荐系统实例详解
2019/06/25 Python
Python使用mongodb保存爬取豆瓣电影的数据过程解析
2019/08/14 Python
python针对mysql数据库的连接、查询、更新、删除操作示例
2019/09/11 Python
python内打印变量之%和f的实例
2020/02/19 Python
用python获取txt文件中关键字的数量
2020/12/24 Python
前端实现弹幕效果的方法总结(包含css3和canvas的实现方式)
2018/07/12 HTML / CSS
英国在线自行车店:Merlin Cycles
2018/08/20 全球购物
Ado与Ado.net的相同与不同
2014/12/08 面试题
大学生物业管理求职信
2013/10/24 职场文书
毕业生就业意向书
2014/04/01 职场文书
国贸专业求职信
2014/06/28 职场文书
毕业实习指导教师评语
2014/12/31 职场文书
应届毕业生求职信范文
2015/03/19 职场文书
2015年护士节慰问信
2015/03/23 职场文书
python requests模块的使用示例
2021/04/07 Python
Redis 操作多个数据库的配置的方法实现
2022/03/23 Redis
SONY AN-LP1 短波有源天线放大器图
2022/04/05 无线电
Linux在两个服务器直接传文件的操作方法
2022/08/05 Servers