很多開發者寫物件導向的應用程式時對每個類別的定義建立一個 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需要載入腳本2.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+ 中的異常處理
Example #4 自動載入在PHP 5.3.0+ 中的異常處理一個異常拋給不存在的自訂異常處理函數。 以上程式會輸出:Want to load NonLoadableClass.Want to load MissingException.
Fatal error: Class 'MissingException' not found in testMissningException. Class '