电信主站 网通分站
购买流程 付款方式 常见问题 在线提问 续租服务 购物车
用户名: 密 码: 忘记密码?
首 页
域名注册
虚拟主机
双线主机
服务器租用
VPS主机
企业邮局
代理专区
客服中心
虚拟主机行业资讯 虚拟主机评测对比 互联网最新动态 技术学院 站长资讯 在线教程 网站运营
搜索优化 服务器 网络编程 图形图象 站长之家 网页制作 操作系统
冲浪宝典 软件教学 视频通信 办公软件 邮件系统 网络安全 认证考试
您当前位置:西部数码->资讯中心-> 在线教程-> PHP
PHP5对象体系-PHP教程,其它文章
作者:网友供稿 点击:8
  西部数码-全国虚拟主机10强!20余项虚拟主机管理功能,全国领先!第6代双线路虚拟主机,南北访问畅通无阻!虚拟主机可在线rar解压,自动数据恢复设置虚拟目录等.虚拟主机免费赠送访问统计,企业邮局.Cn域名注册10元/年,自助建站480元起,免费试用7天,满意再付款!P4主机租用799元/月.月付免压金!
文章页数:[1] 
* 本文是对《classes and objects in php5》系列文章的补充和修正,介绍了php5对象体系的总体框架,但有些特性没有具体介绍。强烈建议在读过《classes and objects in php5》后阅读本文。



php5推出的对象体系相信是大家最为期待的。php5借鉴了java2的对象模型,提供了较为强大的面向对象编程支持,使用php来实现oo将变得轻松和自然。



对象传递



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 自动释放内存空间

?>



以上是php5在内存管理上的变化,也许大家不怎么感兴趣。下面我们来看看php5中的对象模型和php4有什么具体的不同之处:



★ 新增功能

★ 改进功能



1) ★ private and protected members 私有和保护类成员(属性,方法)

2) ★ abstract classes and methods 抽象类和抽象方法

3) ★ interfaces             接口

4) ★ class type hints  类型指示 =

5) ★ final  final关键字 =

6) ★ objects cloning  对象复制 =

7) ★ constructors and destructors 构造函数和析构函数

8) ★ class constants 类常量 =

9) ★ exceptions 异常处理

10) ★ static member 静态类成员

11) ★__method__ constant __method__常量 =

12) ★ reflection 反射机制 



第1、2、3、7、10请自行查阅本文末尾的《classes and objects in php5》系列,其中已有详细介绍,本文中不再讲解。第9点异常处理和第12点反射机制内容较为丰富,限于篇幅亦不在文中介绍,请关注即将推出的《php & more》电子杂志第二期,会专门撰文介绍。



以下向大家介绍第4、5、6、8、11点语言特性:



4) ★ class type hints  类型指示



大家都知道,php是一种弱类型的语言。在使用变量前不需要定义,不需要声明变量的数据类型。这在编程中带来很多便利,但也带了一些隐患,特别当变量的类型变化时。在php5增加了类型指示,可以在执行过程中自动对类方法的参数类型进行判断。这类似于java2中的rtti,配合reflection可以让我们很好地控制对象。





<?php
interface foo {
function a(foo $foo);
}

interface bar {
function b(bar $bar);
}

class foobar implements foo, bar {
function a(foo $foo) {
// ...
}

function b(bar $bar) {
// ...
}
}

$a = new foobar;
$b = new foobar;

$a->a($b);
$a->b($b);
?>



在强类型语言中,所有变量的类型将在编译时进行检查,而在php中使用类型指示来对类型的检查则发生在运行时。如果类方法参数的类型不对,将会报出类似“fatal error: argument 1 must implement interface bar…”这样的错误信息。



以下代码:

<?php
function foo(classname $object) {
// ...
}
?>



相当于:

<?php
function foo($object) {
if (!($object instanceof classname)) {
die("argument 1 must be an instance of classname");
}
}
?>





5) ★ final  final关键字



php5中新增加了final关键字,它可以加在类或类方法前。标识为final的类方法,在子类中不能被覆写。标识为final的类,不能被继承,而且其中的方法都默认为final类型。

final方法:

<?php
class foo {
final function bar() {
// ...
}
}
?>



final类:

<?php
final class foo {
// class definition
}

// 下面这一行是错误的
// class bork extends foo {}
?>



6) ★ objects cloning  对象复制

前面在内存管理部份说过,php5中默认通过引用传递对象。像使用$object2=$object1这样的方法复制出的对象是相互关联的。如果我们确实需要复制出一个值与原来相同的对象而希望目标对象与源对象没有关联(像普通变量那样通过值来传递),那么就需要使用clone关键字。如果还希望在复制的同时变动源对象中的某些部份,可以在类中定一个__clone()函数,加入操作。



<?php
//对象复制
class mycloneable {
static $id = 0;

function mycloneable() {
$this->id = self::$id++;
}


/*
function __clone() {
$this->address = "new york";
$this->id = self::$id++;
}
*/
}

$obj = new mycloneable();

$obj->name = "hello";
$obj->address = "tel-aviv";

print $obj->id . "\n";

$obj_cloned = clone $obj;

print $obj_cloned->id . "\n";
print $obj_cloned->name . "\n";
print $obj_cloned->address . "\n";
?>



以上代码复制出一个完全相同的对象。



然后请把function __clone()这一个函数的注释去掉,重新运行程序。则会复制出一个基本相同,但部份属性变动的对象。



8) ★ class constants 类常量

php5中可以使用const关键字来定义类常量。



<?php
class foo {
const constant = "constant";
}

echo "foo::constant = " . foo::constant . "\n";
?>

















11) ★__method__ constant __method__常量

__method__ 是php5中新增的“魔术”常量,表示类方法的名称。
魔术常量是一种php预定义常量,它的值可以是变化的,php中的其它已经存在的魔术常量有__line__、__file__、__function__、__class__等。

<?php
class foo {
function show() {
echo __method__;
}
}

class bar extends foo {
}

foo::show(); // outputs foo::show
bar::show(); // outputs foo::show either since __method__ is
// compile-time evaluated token

function test() {
echo __method__;
}

test(); // outputs test
?>


文章整理:西部数码--专业提供域名注册虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!
相关主题
文章页数:[1] 
Google
热门文章
·Windows下的PHP5.0安装配制详解-PHP教程,PHP安装
·PHP在XP下IIS和Apache2服务器上的安装-PHP教程,PHP应用
·最近忙于FTP,好站多多!有好多好东东哦!不敢独享!-PHP教程,PHP基础
·PHP 5.0 Pear安装方法-PHP教程,PHP安装
·PHP开发利器-PRADO 1.6(4)-PHP教程,PHP应用
·Sun Sparc Solaris 2.6 Apache-1.3.12+MySQL-3.23.5+PHP-3.0.15 安装记-PHP教程,PHP应用
·php5学习笔记(转)-PHP教程,PHP应用
·APACHE安装笔记-PHP教程,PHP安装
·PHP.MVC的模板标签系统(四)-PHP教程,PHP应用
·PHP.MVC的模板标签系统(二)-PHP教程,PHP应用

最新文章
·PHP源码-利用 QQWry.Dat 实现 IP 地址高效检索
·Php高手带路--问题汇总解答[2]
·PHPQQ编程(2):取QQ在线状态
·php5手动最简安装方法
·福利彩票幸运号码自动生成器
·PHP开发利器-PRADO 1.6
·在Apache 服务器上启用PHP支持
·Windows2000_pro下安装Apache+PHP4+My
·php文件上传的实现
·PHP开发框架的现状和展望


 
 


版权申明:本站文章均来自网络,如有侵权,请联系我们,我们收到后立即删除,谢谢!

特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有。
  打印  刷新  关闭
返回首页 |关于我们 | 联系我们 | 付款方式 | 创业联盟 | 虚拟主机 | 资讯中心 | 友情链接 | 网站地图

版权所有 西部数码(www.west263.com)
CopyRight (c) 2002~2006 west263.com all right reserved.
公司地址:四川成都市万和路90号天象大厦4楼 邮编:610031
电话总机:028-86262244 86263048 86263408 86263960 86264018 86267838
售前咨询:总机转201 202 203 204 206 208
售后服务:总机转211 212 213 214
财务咨询:总机转224 223 传真:028-86264041 财务QQ:点击发送消息给对方635483282
售前咨询QQ:点击发送消息给对方2182518 点击发送消息给对方241975952 点击发送消息给对方275026793 点击发送消息给对方408235859
售后服务QQ:点击发送消息给对方17708515 点击发送消息给对方307742704 点击发送消息给对方287976517 点击发送消息给对方363783715
《中华人民共和国增值电信业务经营许可证》编号:川B2-20030065号