分享
 
 
 

PHP 5/Zend Engine 2.0的改进

王朝php·作者佚名  2006-11-24
窄屏简体版  字體: |||超大  

近两年没有使用PHP写过程序了,今天要用PHP,就在网上查了查,看到了PHP5,一时之间兴趣又大了起来,于是翻译了这篇文章。

文章来源于http://www.php.net/。

新的对象模型

PHP中的对象处理部分已完全重写,具有更佳的性能和更多的功能。在先前的PHP版本中,对象被当做原始的简单类型

(如integer和string)来处理,这种方法的缺点是当变量被赋值或作为参数传递时,得到的是对象拷贝。而在新版本中,

对象是通过句柄来引用的,而不是通过对象的值(句柄想象为对象的标识符)。

很多PHP程序员可能未意识到老的对象模型的“copying quirks“,因此以前的大多数PHP程序将不需要做任何更改

即可运行,或只做很少的改动。

私有和保护成员

PHP 5引进了私有和保护成员变量,它们可以定义可视化的类属性。

示例

保护成员变量能在该类的子类中被访问,而私有成员变量只能在所属类中被访问。

<?phpclass MyClass { private $Hello = "Hello, World!\n"; protected $Bar = "Hello, Foo!\n"; protected $Foo = "Hello, Bar!\n"; function printHello() { print "MyClass::printHello() " . $this->Hello; print "MyClass::printHello() " . $this->Bar; print "MyClass::printHello() " . $this->Foo; }}class MyClass2 extends MyClass { protected $Foo; function printHello() { MyClass::printHello(); /* Should print */ print "MyClass2::printHello() " . $this->Hello; /* Shouldn't print out anything */ print "MyClass2::printHello() " . $this->Bar; /* Shouldn't print (not declared)*/ print "MyClass2::printHello() " . $this->Foo; /* Should print */ }}$obj = new MyClass();print $obj->Hello; /* 不输出任何内容,以下类同 */print $obj->Bar; /* Shouldn't print out anything */print $obj->Foo; /* Shouldn't print out anything */$obj->printHello(); /* Should print */$obj = new MyClass2();print $obj->Hello; /* Shouldn't print out anything */print $obj->Bar; /* Shouldn't print out anything */print $obj->Foo; /* Shouldn't print out anything */$obj->printHello();?>

私有和保护方法

PHP 5(ZEND引擎2)中,私有方法和保护方法也被引入。

示例:

<?phpclass Foo { private function aPrivateMethod() { echo "Foo::aPrivateMethod() called.\n"; } protected function aProtectedMethod() { echo "Foo::aProtectedMethod() called.\n"; $this->aPrivateMethod(); }}class Bar extends Foo { public function aPublicMethod() { echo "Bar::aPublicMethod() called.\n"; $this->aProtectedMethod(); }}$o = new Bar;$o->aPublicMethod();?>

以前代码中的用户自定义类或方法中虽然没有定义"public," "protected" 或 "private"等关键字,但无需修改即可运行。

抽象类和方法

PHP 5还引入了抽象类和方法。抽象方法只声明方法的”符号”,而不提供它的实现。一个包含抽象方法的类需要声明为”abstract”。

例如:

<?phpabstract class AbstractClass { abstract public function test();}class ImplementedClass extends AbstractClass { public function test() { echo "ImplementedClass::test() called.\n"; }}$o = new ImplementedClass;$o->test();?>

抽象类不能实例化。

旧的代码中的用户自定义类或方法中虽未定义"abstract”关键字,但无需修改就可以运行。

接口(Interfaces)

ZEND引擎2.0引入了接口。一个类可以实现任意的接口列表。

例如:

<?phpinterface Throwable { public function getMessage();}class Exception implements Throwable { public function getMessage() { // ...}?>

旧的代码中的用户定义类或方法中虽然没有定义"interface”关键字,但无需修改就可以正常运行。

类类型提示(Class Type Hints)

在保留类无需定义类型的同时,PHP 5引入了类类型提示来声明,以期望把对象的类通过参数传递给一个方法。

例如:

<?phpinterface 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);?>

这些类类型提示不是象一些需要类型定义的语言那样在编译中进行检查,而是在运行时进行检查。这就意味着:

<?phpfunction foo(ClassName $object) { // ...}?>

is equivalent to:

<?phpfunction foo($object) { if (!($object instanceof ClassName)) { die("Argument 1 must be an instance of ClassName"); }}?>

这种语法只用于对象或类,不适用于内建(built-in)类型。

Final关键字(final)

PHP 5引入了“final”关键字以定义在子类中不能被覆盖的成员或方法。

例:

<?php

class Foo { final function bar() { // ... }}?>

以前所写代码中的用户自定义类或方法中虽未定义"final"关键字,但无需修改就可以运行了。

对象克隆(Object Cloning)

PHP 4在对象被复制时,用户不能判断运行那个拷贝构造函数。在复制时,PHP 4根据对象的属性

一位一位地复制一个同样的复制品。

每次都要建立一个完全一样的复制品并不总是我们想要的。一个很好的复制构造例子是,当有

一个代表一个GTK窗口的对象,它拥有该窗口的所有资源,当你建立一个拷贝时,你可能需要一

个新的窗口,它拥有原窗口的所有属性,但需要拥有新窗口的资源。另外一个例子是你有一个

对象引用了另外一个对象,当你复制父对象时,你希望建立那个引用对象的新实例,以使复制品有一个单独的拷贝。

对一个对象的拷贝通过调用对象的__clone()方法完成:

<?php

$copy_of_object = $object->__clone();

?>

当开发者请求建立一个对象的新的拷贝时,ZEND引擎会检查是否已经定义了__clone()方法。如果未定义

的话,它会调用一个默认的__clone()方法来复制该对象的所有属性。如果定义了该方法,该方法会负责

在拷贝中设置必要的属性。为使用方便,引擎会提供一个函数从源对象中导入所有的属性,这样它就可

以先得到一个具有值的源对象拷贝,然后只需要对需要改变的属性进行覆盖即可。

例:

<?php

class MyCloneable {

static $id = 0;

function MyCloneable() {

$this->id = self::$id++;

}

function __clone() {

$this->name = $that->name;

$this->address = "New York";

$this->id = self::$id++;

}

}

$obj = new MyCloneable();

$obj->name = "Hello";

$obj->address = "Tel-Aviv";

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

$obj = $obj->__clone();

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

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

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

?>

统一的构造方法

ZEND引擎允许开发者定义类的构造方法。具有构造方法的类在新建时会首先调用构造方法,构造

方法适用于在正式使用该类前进行的初始化。

在PHP4中,构造方法的名称与类名相同。由于在派生类中调用父类的作法比较普遍,因此导致在

PHP4中当类在一个大型的类继承中进行移动时,处理方式有点笨拙。当一个派生类被移动到一个不同

的父类中时,父类的构造方法名必然是不同的,这样的话派生类中的有关调用父类构造方法的语句需要改写。

PHP5引入了一个定义构造方法的标准方式,通过调用它们的__construct()来定义。

示例:

<?php

class BaseClass {

function __construct() {

print "In BaseClass constructor\n";

}

}

class SubClass extends BaseClass {

function __construct() {

parent::__construct();

print "In SubClass constructor\n";

}

}

$obj = new BaseClass();

$obj = new SubClass();

?>

为向后兼容,当PHP5类不能找到__construct()方法时,会通过老的方法也就是类名

来查找构造方法。这意味着唯一可能产生兼容性问题的是在以前的代码中已经使用了

一个名为__construct()的方法名。

析构方法

定义析构方法是十分有用的。析构方法可以记录调试信息,关闭数据库连接,还有做其它的扫尾

工作。PHP4中并无此机制,尽管PHP已支持注册在请求结束时需要运行的函数。

PHP5引入了与其它面向对象语言如Java语言相似的析构方法:当最后一个该对象的引用被清除时,

系统将会在该对象从内存中释放前调用名为__destruct()的析构方法。

示例:

<?php

class MyDestructableClass {

function __construct() {

print "In constructor\n";

$this->name = "MyDestructableClass";

}

function __destruct() {

print "Destroying " . $this->name . "\n";

}

}

$obj = new MyDestructableClass();

?>

和构造方法相似,引擎将不调用父类的析构方法,为调用该方法,你需要在子

类的析构方法中通过parent::__destruct()语句进行调用。

常量

PHP 5 引入了类常量(per-class constants)定义:

<?php

class Foo {

const constant = "constant";

}

echo "Foo::constant = " . Foo::constant . "\n";

?>

PHP5允许常量中包含表达式,但在编译时常量中的表达式将被计算,

因此常量不能在运行中改变它的值。

<?php

class Bar {

const a = 1<<0;

const b = 1<<1;

const c = a | b;

}

?>

以前代码中的用户自定义类或方法中虽然未定义"const”关键字,

但无需修改就可以运行。

异常(Exceptions)

PHP4中没异常处理,PHP5引入了与其它与语言相似的异常处理模型。

<?php

class MyExceptionFoo extends Exception {

function __construct($exception) {

parent::__construct($exception);

}

}

try {

throw new MyExceptionFoo("Hello");

} catch (MyExceptionFoo $exception) {

print $exception->getMessage();

}

?>

以前代码中的用户自定义类或方法中虽未定义'catch', 'throw' 和 'try'关键字,但无需修改

就可以运行。

函数返回对象值

在PHP4中,函数不可能返回对象的值并对返回的对象进行方法调用,随着Zend Engine 2

(ZEND引擎2)的出现,以下调用成为可能:

<?php

class Circle {

function draw() {

print "Circle\n";

}

}

class Square {

function draw() {

print "Square\n";

}

}

function ShapeFactoryMethod($shape) {

switch ($shape) {

case "Circle":

return new Circle();

case "Square":

return new Square();

}

}

ShapeFactoryMethod("Circle")->draw();

ShapeFactoryMethod("Square")->draw();

?>

静态类中的静态成员变量可初始化

例如:

<?php

class foo {

static $my_static = 5;

}

print foo::$my_static;

?>

静态方法(Static Methods)

PHP5引入了关键字'static'来定义一个静态方法,这样可以从对象外进行调用。

例如:

<?php

class Foo {

public static function aStaticMethod() {

// ...

}

}

Foo::aStaticMethod();

?>

虚拟变量$this在被定义为静态(static)的方法中无效。

Instanceof

PHP5引入了 “instanceof“关键字来确定一个对象是否是某一个对象的实例,或某一个对象的派生,或使用了某一个接口。

示例:

<?php

class baseC

[1] [2] 下一页

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有