PHP 5/Zend Engine 2.0的改进(二)

王朝php·作者佚名  2006-01-08
宽屏版  字体: |||超大  

[接上页]

PHP 5/Zend Engine 2.0的改进

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 baseClass { }

$a = new baseClass;

if ($a instanceof basicClass) {

echo "Hello World";

}

?>

静态函数变量(Static function variables)

所有的静态变量现在在编译时进行处理,这允许开发者通过引用来指定静态变量。这个变化提高了效率但意味着不可能对静态变量进行间接引用。

函数中通过引用方式传递的参数允许有默认值

例如:

<?php

function my_function(&$var = null) {

if ($var === null) {

die("$var needs to have a value");

}

}

?>

__autoload()

在初始化一个未定义的类时,__autoload()拦截函数(interceptor function)将被自动调

用。类名将作为__autoload()拦截函数唯一参数传递给它。

例如:

<?php

function __autoload($className) {

include_once $className . ".php";

}

$object = new ClassName;

?>

方法和属性调用的重载

所有方法调用和属性访问都可以通用 __call(), __get() 和 __set()方法来重载。

例: __get() 和 __set()

<?php

class Setter {

public $n;

public $x = array("a" => 1, "b" => 2, "c" => 3);

function __get($nm) {

print "Getting [$nm]\n";

if (isset($this->x[$nm])) {

$r = $this->x[$nm];

print "Returning: $r\n";

return $r;

} else {

print "Nothing!\n";

}

}

function __set($nm, $val) {

print "Setting [$nm] to $val\n";

if (isset($this->x[$nm])) {

$this->x[$nm] = $val;

print "OK!\n";

} else {

print "Not OK!\n";

}

}

}

$foo = new Setter();

$foo->n = 1;

$foo->a = 100;

$foo->a++;

$foo->z++;

var_dump($foo);

?>

示例: __call()

<?php

class Caller {

var $x = array(1, 2, 3);

function __call($m, $a) {

print "Method $m called:\n";

var_dump($a);

return $this->x;

}

}

$foo = new Caller();

$a = $foo->test(1, "2", 3.4, true);

var_dump($a);

?>

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
© 2005- 王朝网络 版权所有