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 根据url自动生成缩略图并处理高并发问题
Jan 23 PHP
php判断ip黑名单程序代码实例
Feb 24 PHP
ThinkPHP框架实现session跨域问题的解决方法
Jul 01 PHP
PHP中的traits简单使用实例
May 13 PHP
PHP生成唯一订单号
Jul 05 PHP
如何通过Linux命令行使用和运行PHP脚本
Jul 29 PHP
php有效防止同一用户多次登录
Nov 19 PHP
PHPExcel简单读取excel文件示例
May 26 PHP
Yii框架使用魔术方法实现跨文件调用功能示例
May 20 PHP
PHP正则匹配操作简单示例【preg_match_all应用】
Jul 10 PHP
Yii2框架中使用PHPExcel导出Excel文件的示例
Aug 09 PHP
Laravel如何使用Redis共享Session
Feb 23 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
在VS2008中编译MYSQL5.1.48的方法
2010/07/03 PHP
PHP UTF8中文字符截断函数代码
2012/09/11 PHP
PHP获取本周第一天和最后一天示例代码
2014/02/24 PHP
PHP使用Mysql事务实例解析
2014/09/08 PHP
php获取ip及网址的简单方法(必看)
2017/04/01 PHP
php取出数组单个值的方法
2018/03/12 PHP
PHP的简单跳转提示的实现详解
2019/03/14 PHP
彪哥1.1(智能表格)提供下载
2006/09/07 Javascript
超强的IE背景图片闪烁(抖动)的解决办法
2007/09/09 Javascript
jQuery 学习第七课 扩展jQuery的功能 插件开发
2010/05/17 Javascript
jQuery 绑定事件到动态创建的元素上的方法实例
2013/08/18 Javascript
使用JavaScript修改浏览器URL地址栏的实现代码
2013/10/21 Javascript
js控制网页前进和后退的方法
2015/06/08 Javascript
jquery中ajax跨域方法实例分析
2015/12/18 Javascript
jquery实现简单的全选和反选功能
2016/01/02 Javascript
JavaScript学习总结之正则的元字符和一些简单的应用
2017/06/30 Javascript
详解基于angular-cli配置代理解决跨域请求问题
2017/07/05 Javascript
JavaScript 通过Ajax 动态加载CheckBox复选框
2017/08/31 Javascript
jquery tmpl模板(实例讲解)
2017/09/02 jQuery
vue2组件之select2调用的示例代码
2017/10/12 Javascript
vue实现移动端项目多行文本溢出省略
2020/07/29 Javascript
基于NodeJS开发钉钉回调接口实现AES-CBC加解密
2020/08/20 NodeJs
vue实现两个区域滚动条同步滚动
2020/12/13 Vue.js
[02:55]2018DOTA2国际邀请赛勇士令状不朽珍藏Ⅲ饰品一览
2018/08/01 DOTA
pytorch 转换矩阵的维数位置方法
2018/12/08 Python
详解小白之KMP算法及python实现
2019/04/04 Python
python加载自定义词典实例
2019/12/06 Python
HTML5实现WebSocket协议原理浅析
2014/07/07 HTML / CSS
销售经理工作职责范文
2013/12/03 职场文书
事业单位分类改革实施方案
2014/03/21 职场文书
社区春季防火方案
2014/06/02 职场文书
应届毕业生求职信范文
2014/07/07 职场文书
教师党的群众路线教育实践活动学习笔记
2014/11/05 职场文书
python实现调用摄像头并拍照发邮箱
2021/04/27 Python
Windows10安装Apache2.4的方法步骤
2022/06/25 Servers
OpenFeign实现远程调用
2022/08/14 Java/Android