PHP 5 物件新語法簡介
例外
以往在 PHP 4 裏,要回傳錯誤,理所當然是回傳 0 或 -1 等於範圍以外的值,再於呼叫函數後檢查傳回值。但是,在建構子裏卻不能回傳,那麼怎樣表達在建構子中發生的錯誤呢?PHP 從 C++ 處(沒有 finally,那當然不是Java)借來例外處理 (exception handling):
class foo {
public function __construct($settings) {
if (!file_exists($settings))
throw new Exception("Settings not found!!!");
...
}
}
$f = new foo("settings.xml"); //如 settings.xml 不存在,程式終止
//以下是一個較周全的辦法
try {
$f = new foo("settings.xml");
} catch (Exception $e) {
echo $e; //會顯示 "Settings not found!!!",程式不會終止
}
final
final 關鍵字襲自Java,功能相同,不允許重載成員函數 ( final public function foo() )甚至整個類別 ( final class foo { … } )。
反射物件方法 (Reflection)
這又是一來自 Java 的強大功能。基本上它不是 PHP 的基礎語法,而是另一套函式,供在執行時存取物件特性及成員。例如存著類別宣告的檔案,行數,存取範圍(public,private,protected)等等。除此外,還可以使用反射動態地實體化物件及呼叫成員函數。但是由於函數太多,不在此列出來,請看此。
複製(clone)
在此強調是 clone 而不是 copy。此法可以建構一個資料完全相同的新實體。
$original = new foo();
$cp = $original; //參考複製
$cl = clone $original; //新實體複製,「克隆」是也
$cp->field++; //$original 會跟著改變
$cl->field++; //$original 不會改變,只會改變 $cl
此外,物件可實作 __clone() 方法,供複製時執行。
型態限制(Type Hinting)
PHP 是弱型態語言(weakly typed language),變數不會被冠上型態。針對物件不同的成員存取,PHP 5 可使用 type hinting 限制函數引數的類別類型。
function foo(bar $args) { ... } //只可以傳入基底類別為 bar 的變數參考
動態成員 (Overloading)
此 Overloading 和 C++/Java 的 overloading 有很大差異。C++/Java overloading 的存在目的是由於型別限制引數,所以可以相同名稱的成員,建立擁有不同引數要求的函數。PHP 卻沒這回事,overloading 是指在類別沒宣告的成員可以動態方法處理。
class foo {
public __call($method, $param) { ... }
public __set($field, $value) { ... }
public __get($field) { ... }
}
$f = new foo();
echo $f->dynField; //即 echo $f->__get("dynField");
$f->someField = 3; //即 $f->__set("someField", 3);
$f->someFunc("hello", 3); //即 $f->__call("someFunc", array("hello", 3));
魔術方法 (Magic Methods)
__sleep() 及 __awake()
執行串列化時會被執行的函數。例如串列化時候儲存變更,還原時再新連接資料庫。
__toString()
來自 Java,當PHP 發現物件被當作字串處理時便會執行。
物件比對
==:用作比對兩物體是否有相同成員變數值,不理會是否為同一個實體
===:用作比對是否為同一個實體
自動載入物件
這是個給懶人用的方法。如果PHP 找不到用作實體化類別的定義,便會呼叫 __autoload(“class_name”)。當然這個 __autoload 是要自己寫出來的。
物件列舉(Object Iteration)
這個其實包括兩大要素:成員列舉及列舉器(Iterator)(來自 C++ STL 乎?)。
前者以 foreach($class as $key=>$value) 語法列舉可見的成員。後者則較為複雜,不過大概是以物件建立複雜的資料結構而已。只要你的物件實作 Iterator 介面便可。
應該也涵蓋了大部份啦。PHP 5 的 OOP 實在有很大進步,不過只是沒有真正的 type hinting 是一美中不足之處吧?要是有了這個,可省回很多檢查資料型態的程式碼。我相信未來 PHP 的版本應該會有這種東西 (最好就像 VB 一樣可加入前處理器符號告訢直譯器要不要用強型態),不過應該不會在 PHP 5 啦。
Pages: 1 2