[接上页]
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); ?>

|