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 相关文章推荐
腾讯QQ php程序员面试题目整理
Jun 08 PHP
php批量上传的实现代码
Jun 09 PHP
win7+apache+php+mysql环境配置操作详解
Jun 10 PHP
PHP入门经历和学习过程分享
Apr 11 PHP
CodeIgniter启用缓存和清除缓存的方法
Jun 12 PHP
PHP读取文件的常见几种方法
Nov 03 PHP
php检测mysql表是否存在的方法小结
Jul 20 PHP
ThinkPHP实现转换数据库查询结果数据到对应类型的方法
Nov 16 PHP
浅谈使用 Yii2 AssetBundle 中 $publishOptions 的正确姿势
Nov 08 PHP
PHP whois查询类定义与用法示例
Apr 03 PHP
thinkPHP5.1框架中Request类四种调用方式示例
Aug 03 PHP
Yii2框架中一些折磨人的坑
Dec 15 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 目录与文件处理-郑阿奇(续)
2011/07/04 PHP
php读取mysql乱码,用set names XXX解决的原理分享
2011/12/29 PHP
ThinkPHP基本的增删查改操作实例教程
2014/08/22 PHP
PHP 9 大缓存技术总结
2015/09/17 PHP
js活用事件触发对象动作
2008/08/10 Javascript
使用Post提交时须将空格转换成加号的解释
2013/01/14 Javascript
按下回车键指向下一个位置的一个函数代码
2014/03/10 Javascript
html的DOM中document对象images集合用法实例
2015/01/21 Javascript
JavaScript实现模仿桌面窗口的方法
2015/07/18 Javascript
jquery淡入淡出效果简单实例
2016/01/14 Javascript
Bootstrap3 内联单选和多选框
2016/12/29 Javascript
Bootstrap下拉菜单样式
2017/02/07 Javascript
配置nodejs环境的方法
2017/05/13 NodeJs
node的process以及child_process模块学习笔记
2018/03/06 Javascript
angularjs实现table表格td单元格单击变输入框/可编辑状态示例
2019/02/21 Javascript
前端天气插件tpwidget使用方法详解
2019/06/24 Javascript
Bootstrap实现省市区三级联动(亲测可用)
2019/07/26 Javascript
[01:02:20]Mineski vs TNC 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/16 DOTA
centos系统升级python 2.7.3
2014/07/03 Python
python实现的系统实用log类实例
2015/06/30 Python
PyCharm安装Markdown插件的两种方法
2019/06/24 Python
详解python中__name__的意义以及作用
2019/08/07 Python
python实现猜数字游戏
2020/03/25 Python
python plotly画柱状图代码实例
2019/12/13 Python
浅谈TensorFlow之稀疏张量表示
2020/06/30 Python
谷歌浏览器小字体处理方案即12px以下字体
2013/12/17 HTML / CSS
迪卡侬(Decathlon)加拿大官网:源自法国的运动专业超市
2020/11/22 全球购物
AOP的定义以及作用
2013/09/08 面试题
我爱家乡演讲稿
2014/09/12 职场文书
三好生演讲稿
2014/09/12 职场文书
委托书的写法
2014/09/16 职场文书
正风肃纪剖析材料范文
2014/10/10 职场文书
校园游戏活动新闻稿
2014/10/15 职场文书
装配车间主任岗位职责
2015/04/08 职场文书
学习经验交流会演讲稿
2015/11/02 职场文书
Pytorch中的数据集划分&正则化方法
2021/05/27 Python