很多開發人員寫物件導向的應用程式時對每個類的定義建立一個 PHP 源檔案。一個很大的煩惱是不得不在每個指令碼開頭寫一個長長的包含檔案清單(每個類一個檔案)。
在 PHP 5 中,不再需要這樣了。可以定義一個 __autoload() 函數,它會在試圖使用尚未被定義的類時自動調用。通過調用此函數,指令碼引擎在 PHP 出錯失敗前有了最後一個機會載入所需的類。
Tip
spl_autoload_register() 提供了一種更加靈活的方式來實作類別的自動載入。因此,不再建議使用 __autoload() 函數,在以後的版本中它可能被棄用。
Note:
在 5.3.0 版之前,__autoload 函數拋出的異常不能被 catch 語句塊捕獲並會導致一個致命錯誤。從 5.3.0+ 之後,__autoload 函數拋出的異常可以被 catch 語句塊捕獲,但需要遵循一個條件。如果拋出的是一個自訂異常,那麼必須存在相應的自訂異常類。__autoload 函數可以遞迴的自動載入自訂異常類。
Note:
自動載入不可用於 PHP 的 CLI 互動模式。
Example #1 自動載入樣本
本例嘗試分別從 MyClass1.php 和 MyClass2.php 檔案中載入 MyClass1 和 MyClass2 :
function __autoload($class_name){require_once $class_name.'.php';}$obj = new MyClass1();$obj2 = new MyClass2();
注意:MyClass1.php和MyClass2.php需要和當前指令碼在同一目錄才能載入到
Example #2 另一個例子
本例嘗試載入介面 ITest:
function __autoload($name) { var_dump($name);}class Foo implements ITest {}/*string(5) "ITest"Fatal error: Interface 'ITest' not found in ...*/
Example #3 自動載入在 PHP 5.3.0+ 中的異常處理
本例拋出一個異常並在 try/catch 語句塊中示範。
function __autoload($name) { echo "Want to load $name.\n"; throw new Exception("Unable to load $name.");}try { $obj = new NonLoadableClass();} catch (Exception $e) { echo $e->getMessage(), "\n";}
以上常式會輸出:
Want to load NonLoadableClass.
Unable to load NonLoadableClass.
Example #4 自動載入在 PHP 5.3.0+ 中的異常處理 - 沒有自訂異常機制
本例將一個異常拋給不存在的自訂異常處理函數。
以上常式會輸出:
Want to load NonLoadableClass.
Want to load MissingException.
Fatal error: Class 'MissingException' not found in testMissingException.php on line 4