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

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

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章