抽象類
抽象類不能被實例化。 抽象類與其它類一樣,允許定義變量及方法。 抽象類同樣可以定義一個抽象的方法,抽象類的方法不會被執行,不過將有可能會在其派生類中執行。
例六:抽象類
<?php abstract class foo { protected $x; abstract function display(); function setX($x) { $this->x = $x; } } class foo2 extends foo { function display() { // Code } } ?>
__call
PHP5 的對象新增了一個專用方法 __call(),這個方法用來監視一個對象中的其它方法。如果你試著調用一個對象中不存在的方法,__call 方法將會被自動調用。
例七:__call
<?php class foo { function __call($name,$arguments) { print("Did you call me? I'm $name!"); } } $x = new foo(); $x->doStuff(); $x->fancy_stuff(); ?> 這個特殊的方法可以被用來實現“過載(overloading)”的動作,這樣你就可以檢查你的參數并且通過調用一個私有的方法來傳遞參數。
例八:使用 __call 實現“過載”動作
<?php class Magic { function __call($name,$arguments) { if($name=='foo') { if(is_int($arguments[0])) $this->foo_for_int($arguments[0]); if(is_string($arguments[0])) $this->foo_for_string($arguments[0]); } } private function foo_for_int($x) { print("oh an int!"); } private function foo_for_string($x) { print("oh a string!"); } } $x = new Magic(); $x->foo(3); $x->foo("3"); ?>
__set 和 __get
這是一個很棒的方法,__set 和 __get 方法可以用來捕獲一個對象中不存在的變量和方法。
例九: __set 和 __get
<?php class foo { function __set($name,$val) { print("Hello, you tried to put $val in $name"); } function __get($name) { print("Hey you asked for $name"); } } $x = new foo(); $x->bar = 3; print($x->winky_winky); ?>
類型指示
在 PHP5 中,你可以在對象的方法中指明其參數必須為另一個對象的實例。
例十:類型指示
<?php class foo { // code ... } class bar { public function process_a_foo(foo $foo) { // Some code } } $b = new bar(); $f = new foo(); $b->process_a_foo($f); ?> 可以看出,我們可以顯性的在參數前指明一個對象的名稱,PHP5 會識別出這個參數將會要是一個對象實例。
靜態成員
靜態成員和靜態方法在面象對象編程的術語中被稱作 “對象方法(class methods)” 和 “對象變量(class variables)”。 “對象方法” 在一個對象沒有實例化前允許被調用。同樣,“對象變量” 在一個對象沒有實例化前可以被獨立操作控制(不需要用一個對象的方法來控制)。
例十一:對象方法和對象變量
<?php class calculator { static public $pi = 3.14151692; static public function add($x,$y) { return $x + $y; } } $s = calculator::$pi; $result = calculator::add(3,7); print("$result"); ?>
異常處理
異常處理是公認的處理程序錯誤的理想方法,在 Java 及 C++ 中都有這個概念,我們欣喜的看到,在 PHP5 已經加入了這方面的應用。你可以嘗試使用 “try” 和 “catch” 來控制程序的錯誤。
例十二:異常處理
<?php class foo { function divide($x,$y) { if($y==0) throw new Exception("cannot divide by zero"); return $x/$y; } } $x = new foo(); try { $x->divide(3,0); } catch (Exception $e) { echo $e->getMessage(); echo "n<br />n"; // Some catastrophic measure here } ?> 上例中,我們使用了 “try” 來執行花括號中的語句,當有錯誤發生的時候,代碼會把錯誤交給 “catch” 子句來處理,在 “catch” 子句中,你需要指明要把錯誤交給某個對象處理,這樣做可以使代碼結構看起來更清晰,因為現在我們可以把所有的錯誤信息交給一個對象來處理。
自定義錯誤處理
你可以很方便的用自定義的處理錯誤的代碼來控制你的程序中的意外。你僅僅需要從異常類中派生出一個自己的錯誤控制類,在你自己的錯誤控制類中,你需要有一個構造函數和一個 getMessage 方法,以下是一個例子。
例十三:自定義錯誤處理
<?php class WeirdProblem extends Exception { private $data; function WeirdProblem($data) { parent::exception(); $this->data = $data; } function getMessage() { return $this->data . " caused a weird exception!"; } } ?> 現在我們可以使用 “throw new WeirdProblem($foo)” 來拋出一個錯誤句柄,如果錯誤在 “try” 的代碼塊中發生,PHP5 會自動把錯誤交給 “catch” 部分來處理。
名稱空間
名稱空間對類的分組或函數分組很有用。它可以把一些相關的類或函數給組合到一起,方便以后調用。
例十四:名稱空間
<?php namespace Math { class Complex { //...code... function __construct() { print("hey"); } } } $m = new Math::Complex(); ?> 注意你需要在何種情況下使用名稱空間,在實際運用中,你可能會需要聲明兩個或多個名稱一樣的對象來做不同的事情,那么你就可以把他們分別放到不同的名稱空間中去(但接口是要相同的)。
譯者注:本篇文章來自 PHPbuilder,從以上文字中我們高興的看到 PHP5 中新增加的一些優秀的功能。我們還可以看到一些 Java 和 C++ 的影子,現在的 PHP5 還沒有正式發布,等到真正發布那一天,希望能再帶給所有的 PHP 愛好者更多的驚喜。對這方面比較感興趣的朋友可以登錄 PHP 官方新聞組去了解更新情況。新聞組地址為 news://news.php.net ,也可以登錄WEB界面 http://news.php.net 來訪問。讓我們一起來期待新版本的發布吧。:)(超越PHP Avenger)
注:本文章為原創文章,版權歸文章作者與超越PHP網站所有,未經本站同意,禁止任何商業轉載。非盈利網站及個人網站轉載請注明出處,謝謝合作!
|