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

worldblog發表於2007-08-17
PHP 5/Zend Engine 2.0的改進(二) (轉)[@more@]

/Develop/read_article.?id=21008">[接上頁]


5/ Engine 2.0的改進:namespace prefix = o ns = "urn:schemas--com::office" />


允許常量中包含,但在編譯時常量中的表示式將被計算,


因此常量不能在執行中改變它的值。


class Bar {
    const a = 1<<0;
    const b = 1<<1;
    const c = a | b;
}
?>

以前程式碼中的自定義類或方法中雖然未定義"const”關鍵字,


但無需修改就可以執行。



異常(Exceptions)


中沒異常處理,PHP5引入了與其它與語言相似的異常處理模型。


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)的出現,以下呼叫成為可能:


class Circle {
    function draw() {
        print "Circle ";
    }
}
       
class Square {
    function draw() {
        print "Square ";
    }
}

function ShapeFactoryMethod($shape) {
    switch ($shape) {
        case "Circle":
            return new Circle();
        case "Square":
            return new Square();
    }
}

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



靜態類中的靜態成員變數可初始化


例如:


class foo {
    static $my_static = 5;
}

print foo::$my_static;
?>

靜態方法(Static Methods)


PHP5引入了關鍵字'static'來定義一個靜態方法,這樣可以從物件外進行呼叫。


例如:

class Foo {
    public static function aStaticMethod() {
        // ...
    }
}

Foo::aStaticMethod();
?>

虛擬變數$this在被定義為靜態(static)的方法中無效。




Instanceof

PHP5引入了 “instanceof“關鍵字來確定一個物件是否是某一個物件的例項,或某一個物件的派生,或使用了某一個介面。

示例:

class baseClass { }

$a = new baseClass;

if ($a instanceof basicClass) {
    echo "Hello World";
}
?>

靜態函式變數(Static function variables)


所有的靜態變數現在在編譯時進行處理,這允許開發者透過引用來指定靜態變數。這個變化提高了但意味著不可能對靜態變數進行間接引用。


函式中透過引用方式傳遞的引數允許有預設值


例如:

function my_function(&$var = null) {
    if ($var === null) {
        die("$var needs to have a value");
    }
}
?>

__autoload()

在初始化一個未定義的類時,__autoload()攔截函式(interceptor function)將被自動調


用。類名將作為__autoload()攔截函式唯一引數傳遞給它。


例如:


function __autoload($className) {
    include_once $className . ".php";
}

$ = new ClassName;
?>

方法和屬性呼叫的過載


  所有方法呼叫和屬性訪問都可以通用 __call(), __get() 和 __set()方法來過載。



例: __get() 和 __set()


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

    function __get($nm) {
        print "Getting [$nm] ";

        if (isset($this->x[$nm])) {
            $r = $this->x[$nm];
            print "Returning: $r ";
            return $r;
        } else {
            print "Nothing! ";
        }
    }

    function __set($nm, $val) {
        print "Setting [$nm] to $val ";

        if (isset($this->x[$nm])) {
            $this->x[$nm] = $val;
            print "OK! ";
        } else {
            print "Not OK! ";
        }
    }
}

$foo = new Setter();
$foo->n = 1;
$foo->a = 100;
$foo->a++;
$foo->z++;
var_dump($foo);
?>

示例: __call()

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

    function __call($m, $a) {
        print "Method $m called: ";
        var_dump($a);
        return $this->x;
    }
}

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


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-962873/,如需轉載,請註明出處,否則將追究法律責任。

相關文章