上篇我們討論到PHP5的 OOP 特徵,本篇我們繼續上篇的內容介紹及相對於PHP4 版本的其他不同之處。
- 用 const 關鍵字來定義Class 常量:
class MyClass { const SUCCESS = 1; const FAILURE = 0; } // end MyClass echo MyClass::SUCCESS;
- 靜態成員 (static member)
class MyClass { static private $instance = null; } // end MyClass echo MyClass::SUCCESS;
- 靜態方法(Static Method),如:
class MyClass { static function getName() { return 'Dennis'; } } // end MyClass echo MyClass:: getName; // output Dennis
- 抽象類 (Abstract Class):類可以使用 abstract 聲明防止它們被實例化,可以繼承一個抽象類。
abstract class MyClass { abstract function getName(); } // end MyClass
- 抽象方法 (Abstract Method):當從一個抽象類中繼承類延續他們的定義。一個類如果包含一個抽象方法必須用 abstract 聲明。
- 類類型提示 (Class type hints):如某個方法裡的參數傳的是某個 class 類型,程運行的時候會去檢測所傳的參數是不是 declare 時的 class 的 instance
class MyClass { function getName() { echo 'Dennis'; } } // end MyClass function testClassHint(MyClass $myclass) { $myclass->getName(); } testClassHint(new MyClass());
- 支援從方法中返回非關聯物件,也就是說可以直接調用返回物件的方法
// PHP 4: $dummy = $obj->method(); $dummy->method2(); // PHP 5: $obj->method()->method2();
- 疊代Iteration:PHP5 允許 PHP 類和 PHP 擴展類執行一個迭代介面。一旦你執行這個介面,已將可以通過使用 foreach() 語言結構迭代實例化這個類。
- 自動載入類 __autoload():在 PHP4 時代,為了引用已經寫好的 class,在程式執行之前要 include 或 require 這些個 file. 在 PHP5 中,就不需要這麼做了。你可以定義一個 __autoload() 函數,它將自動調用一個還沒有被定義的類。通過調用這個函數,腳本引擎將在 PHP 拋出一個錯誤之前一直持續嘗試讀取這個類。
function __autoload($class_name) { include_once($class_name . 'php'); } $obj = new MyClass1(); $obj2 = new MyClass2();
- 異常處理 (Exception Handling):PHP5 中添加了 try/throw/catch 語句。來完成異常的處理。您可以自定義自己的Exception(必須要繼承built-in class Exception),來處理程式中的邏輯。
class SQLException extends Exception { public $problem; function __construct($problem) { $this->problem = $problem; } } try { // ... throw new SQLException('Could not connect to database'); //... } catch (SQLException $e) { print 'Caught an SQLException with problem $obj->problem'; } catch (Exception $e) { print 'Caught unrecognized exception'; }
- foreach 與引用:在 PHP4 裡,你不能迭代一個陣列和改變它們的值。PHP5 允許你通過使用「&」(引用)標記 foreach() 迴圈來實現,創建任何你改變的值影響你所迭代的陣列。
foreach ($array as &$value) { if ($value === 'NULL') { $value = NULL; // PHP4 can not change value here } }
其他新功能
- XML 擴充:在 PHP5 中,所有的 XML 擴展已經被重寫並使用優秀的 libxml2 XML 工具包。
- SAX:新的 SAX 的實現已經從 Expat 轉到了 libxml2
- DOM 重寫,符合W3C 標準。
- 在 PHP4 中,有兩個擴展支持 XSL 轉化。第一個使用 Sablotron 擴展而第二個在 DOM 擴展中使用 XSLT 支持。在 PHP5 中,寫了一個新的 XSL 擴展,它是基於 libxml2 擴展的。由於在 PHP5 中,XSL 轉換不是提取 XSLT 樣式作為一個參數而是依靠 DOM 擴展去讀取它,這個樣式會被存儲到記憶體中,並應用到文檔來節約執行時間。
- 回顧過去一兩年,我們會很清晰地知道,SimpleXML 已經改變了 PHP 開發者處理 XML 檔的方式。SimpleXML 能夠被真正的叫做XML for Dummies。代替處理 DOM 甚至更糟糕的SAX,SimpleXML 將 XML 檔作為 PHP 物件來描述。你可以讀取、寫入或者使用疊代方便的訪問元素和屬性。
- PHP4 對 SOAP 的支持不是很好,基本要用 PEAR 的 library. PHP5 做了改進