PHP 5/Zend Engine 2.0的改進<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
PHP5允許常量中包含表達式,但在編譯時常量中的表達式將被計算,
因此常量不能在運行中改變它的值。
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 foo {
static $my_static = 5;
}
print foo::$my_static;
?>
Static Methods
例如:
<?php
class Foo {
public static function aStaticMethod() {
// ...
}
}
Foo::aStaticMethod();
?>
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()方法來重載。
<?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);
?>