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 相关文章推荐
BBS(php &amp; mysql)完整版(八)
Oct 09 PHP
用DBSQL类加快开发MySQL数据库程序的速度
Oct 09 PHP
扩展你的 PHP 之入门篇
Dec 04 PHP
PHP XML操作的各种方法解析(比较详细)
Jun 17 PHP
php中3种方法删除字符串中间的空格
Mar 10 PHP
php通过文件流方式复制文件的方法
Mar 13 PHP
php获取英文姓名首字母的方法
Jul 13 PHP
PHP Web木马扫描器代码分享
Sep 06 PHP
PHP连接数据库实现注册页面的增删改查操作
Mar 27 PHP
php模仿qq空间或朋友圈发布动态、评论动态、回复评论、删除动态或评论的功能(中)
Jun 11 PHP
thinkphp5.0自定义验证规则使用方法
Nov 16 PHP
thinkphp5.1框架容器与依赖注入实例分析
Jul 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
php对数组排序代码分享
2014/02/24 PHP
php高清晰度无损图片压缩功能的实现代码
2018/12/09 PHP
javascript实现的鼠标链接提示效果生成器代码
2007/06/28 Javascript
xml转json的js代码
2012/08/28 Javascript
jquery获取radio值(单选组radio)
2014/10/16 Javascript
在Node.js应用中使用Redis的方法简介
2015/06/24 Javascript
JS加载iFrame出现空白问题的解决办法
2016/05/13 Javascript
JS模拟的Map类实现方法
2016/06/17 Javascript
AngularJs Modules详解及示例代码
2016/09/01 Javascript
js 模仿锚点定位的实现方法
2016/11/19 Javascript
vue使用drag与drop实现拖拽的示例代码
2017/09/07 Javascript
Vue 2.0学习笔记之使用$refs访问Vue中的DOM
2017/12/19 Javascript
通过vue提供的keep-alive减少对服务器的请求次数
2018/04/01 Javascript
10分钟彻底搞懂Http的强制缓存和协商缓存(小结)
2018/08/30 Javascript
每天学点Vue源码之vm.$mount挂载函数
2019/03/11 Javascript
vue实现树形结构样式和功能的实例代码
2019/10/15 Javascript
详解JavaScript 的执行机制
2020/09/18 Javascript
python实现多线程的两种方式
2016/05/22 Python
Python简单读取json文件功能示例
2017/11/30 Python
Python基于多线程操作数据库相关问题分析
2018/07/11 Python
python实现邮件发送功能
2019/08/10 Python
django-crontab 定时执行任务方法的实现
2019/09/06 Python
Flask和pyecharts实现动态数据可视化
2020/02/26 Python
CSS3动画效果回调处理详解
2014/12/10 HTML / CSS
HTML5 解析规则分析
2009/08/14 HTML / CSS
印度领先的在线时尚商店:Koovs
2016/08/28 全球购物
阿玛瑞酒店中文官方网站:Amari.com
2018/02/13 全球购物
First Aid Beauty官网:FAB急救面霜
2018/05/24 全球购物
Berghaus官网:户外服装和设备,防水服
2020/01/17 全球购物
成都思必达公司C#程序员招聘面试题
2013/06/26 面试题
保荐人的岗位职责
2013/11/19 职场文书
《商鞅南门立木》教学反思
2014/02/16 职场文书
前处理班长职位说明书
2014/03/01 职场文书
领导接待方案
2014/03/13 职场文书
升国旗演讲稿
2014/09/05 职场文书
python本地文件服务器实例教程
2021/05/02 Python