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下一个阿拉伯数字转中文数字的函数
Jul 16 PHP
怎样去阅读一份php源代码
Aug 21 PHP
用穿越火线快速入门php面向对象
Feb 22 PHP
ThinkPHP查询返回简单字段数组的方法
Aug 25 PHP
php实现Linux服务器木马排查及加固功能
Dec 29 PHP
在PHP中使用FastCGI解析漏洞及修复方案
Nov 10 PHP
PHP版本常用的排序算法汇总
Dec 20 PHP
php常用数组函数实例小结
Dec 29 PHP
基于laravel-admin 后台 列表标签背景的使用方法
Oct 03 PHP
PHP实现数组根据某个字段进行水平合并,横向合并案例分析
Oct 08 PHP
php框架知识点的整理和补充
Mar 01 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及Zend Engine的线程安全模型分析
2011/11/10 PHP
PHP获取本周第一天和最后一天示例代码
2014/02/24 PHP
php获取文件名称和扩展名的方法
2017/02/07 PHP
PHP关键特性之命名空间实例详解
2017/05/06 PHP
CentOS7系统搭建LAMP及更新PHP版本操作详解
2020/03/26 PHP
javascript 网页跳转的方法
2008/12/24 Javascript
用JavaScript将从数据库中读取出来的日期型格式化为想要的类型。
2009/08/15 Javascript
jquery validate poshytip 自定义样式
2012/11/26 Javascript
jquery中get,post和ajax方法的使用小结
2014/02/04 Javascript
jQuery中clone()方法用法实例
2015/01/16 Javascript
深入理解MVC中的时间js格式化
2016/05/19 Javascript
利用Javascript实现简单的转盘抽奖
2017/02/13 Javascript
node上的redis调用优化示例详解
2018/10/30 Javascript
详解webpack4之splitchunksPlugin代码包分拆
2018/12/04 Javascript
命令行批量截图Node脚本示例代码
2019/01/25 Javascript
Vuepress 搭建带评论功能的静态博客的实现
2019/02/17 Javascript
JS防抖和节流实例解析
2019/09/24 Javascript
Vue中jsx不完全应用指南小结
2019/11/01 Javascript
vue ssr+koa2构建服务端渲染的示例代码
2020/03/23 Javascript
JavaScript 判断数据类型的4种方法
2020/09/11 Javascript
[46:12]完美世界DOTA2联赛循环赛 DM vs Matador BO2第一场 11.04
2020/11/04 DOTA
[38:54]完美世界DOTA2联赛PWL S2 Rebirth vs LBZS 第一场 11.28
2020/12/01 DOTA
Python os模块介绍
2014/11/30 Python
python爬虫正则表达式之处理换行符
2018/06/08 Python
python实现键盘控制鼠标移动
2020/11/27 Python
python或C++读取指定文件夹下的所有图片
2019/08/31 Python
python自动下载图片的方法示例
2020/03/25 Python
详解Python模块化编程与装饰器
2021/01/16 Python
python软件测试Jmeter性能测试JDBC Request(结合数据库)的使用详解
2021/01/26 Python
CSS实现的一闪而过的图片闪光效果
2014/04/23 HTML / CSS
租租车:国际租车、美国租车、欧洲租车、特价预订国外租车(中文服务)
2018/03/28 全球购物
环保建议书400字
2014/05/14 职场文书
培训班通知
2015/04/25 职场文书
2015年管理人员工作总结
2015/05/13 职场文书
python爬取网页版QQ空间,生成各类图表
2021/06/02 Python
Redis+Lua脚本实现计数器接口防刷功能(升级版)
2022/02/12 Redis