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下正则来匹配dede模板标签的代码
Aug 21 PHP
PHP中获取变量的变量名的一段代码的bug分析
Jul 07 PHP
php操作xml入门之xml标签的属性分析
Jan 23 PHP
浅析THINKPHP的addAll支持的最大数据量
Feb 03 PHP
php数组添加与删除单元的常用函数实例分析
Feb 16 PHP
php运行时动态创建函数的方法
Mar 16 PHP
PHP学习笔记(一):基本语法之标记、空白、和注释
Apr 17 PHP
CentOS 上搭建 PHP7 开发测试环境
Feb 26 PHP
mac系统下安装多个php并自由切换的方法详解
Apr 21 PHP
laravel框架中控制器的创建和使用方法分析
Nov 23 PHP
PHP实现计算器小功能
Aug 28 PHP
PHP如何防止用户重复提交表单
Dec 09 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
BBS(php &amp; mysql)完整版(四)
2006/10/09 PHP
PHP echo,print,printf,sprintf函数之间的区别与用法详解
2013/11/27 PHP
php使用CURL模拟GET与POST向微信接口提交及获取数据的方法
2016/09/23 PHP
PHP简单数据库操作类实例【支持增删改查及链式操作】
2016/10/10 PHP
PHP中STDCLASS用法实例分析
2016/11/11 PHP
javascript iframe中打开文件,并检测iframe存在否
2008/12/28 Javascript
javascript 去字符串空格终极版(支持utf8)
2009/11/14 Javascript
jQuery创建插件的代码分析
2011/04/14 Javascript
JS刷新框架外页面七种实现代码
2013/02/18 Javascript
JS实现超简单的鼠标拖动效果
2015/11/02 Javascript
javascript实现在网页中运行本地程序的方法
2016/02/03 Javascript
前端学习笔记style,currentStyle,getComputedStyle的用法与区别
2016/05/28 Javascript
正则表达式替换html元素属性的方法
2016/11/26 Javascript
VUE中使用Vue-resource完成交互
2017/07/21 Javascript
深入理解ES6学习笔记之块级作用域绑定
2017/08/19 Javascript
react项目如何使用iconfont的方法步骤
2019/03/13 Javascript
详解关于webpack多入口热加载很慢的原因
2019/04/24 Javascript
从零学python系列之数据处理编程实例(一)
2014/05/22 Python
Python常用正则表达式符号浅析
2014/08/13 Python
Python selenium如何设置等待时间
2016/09/15 Python
Python中装饰器学习总结
2018/02/10 Python
Python爬虫使用浏览器cookies:browsercookie过程解析
2019/10/22 Python
Python使用pymysql模块操作mysql增删改查实例分析
2019/12/19 Python
浅谈keras 的抽象后端(from keras import backend as K)
2020/06/16 Python
css3设置box-pack和box-align让div里面的元素垂直居中
2014/09/01 HTML / CSS
使用HTML5 Geolocation实现一个距离追踪器
2018/04/09 HTML / CSS
Carter’s OshKosh加拿大:购买婴幼儿服装和童装
2018/11/27 全球购物
财务会计专业毕业生自荐信
2013/10/02 职场文书
毕业生自荐信
2013/12/14 职场文书
证婚人经典证婚词
2014/01/09 职场文书
《七颗钻石》教学反思
2014/02/28 职场文书
幼儿园优秀班主任事迹材料
2014/05/14 职场文书
文艺晚会策划方案
2014/06/11 职场文书
2016新年慰问信范文
2015/03/25 职场文书
2015年高中班级工作总结
2015/07/21 职场文书
领导干部学习十八届五中全会精神心得体会
2016/01/05 职场文书