## 類的自動加載
在編寫面向對象(OOP)程序時,很多開發者為每個類新建一個 PHP 文件。這會帶來一個煩惱:每個腳本的開頭,都需要包含(include)一個長長的列表(每個類都有個文件)。
在 PHP 5 中,已經不再需要這樣了。[spl\_autoload\_register()](https://www.php.net/manual/zh/function.spl-autoload-register.php)函數可以注冊任意數量的自動加載器,當使用尚未被定義的類(class)和接口(interface)時自動去加載。通過注冊自動加載器,腳本引擎在 PHP 出錯失敗前有了最后一個機會加載所需的類。
> **Tip**
盡管 [\_\_autoload()](https://www.php.net/manual/zh/function.autoload.php) 函數也能自動加載類和接口,但更建議使用 [spl\_autoload\_register()](https://www.php.net/manual/zh/function.spl-autoload-register.php) 函數。 [spl\_autoload\_register()](https://www.php.net/manual/zh/function.spl-autoload-register.php) 提供了一種更加靈活的方式來實現類的自動加載(同一個應用中,可以支持任意數量的加載器,比如第三方庫中的)。因此,不再建議使用 [\_\_autoload()](https://www.php.net/manual/zh/function.autoload.php) 函數,在以后的版本中它可能被棄用。
> **Note**:
> 在 PHP 5.3 之前,\_\_autoload 函數拋出的異常不能被 [catch](https://www.php.net/manual/zh/language.exceptions.php) 語句塊捕獲并會導致一個致命錯誤(Fatal Error)。 自 PHP 5.3 起,能夠 thrown 自定義的異常(Exception),隨后自定義異常類即可使用。 \_\_autoload 函數可以遞歸的自動加載自定義異常類。
> **Note**:
>
> 自動加載不可用于 PHP 的 CLI [交互模式](https://www.php.net/manual/zh/features.commandline.php)。
> **Note**:
> 如果類名比如被用于 [call\_user\_func()](https://www.php.net/manual/zh/function.call-user-func.php),則它可能包含一些危險的字符,比如 *../*。 建議您在這樣的函數中不要使用用戶的輸入,起碼需要在 [\_\_autoload()](https://www.php.net/manual/zh/function.autoload.php) 時驗證下輸入。
**Example #1 自動加載示例**
本例嘗試分別從 MyClass1.php 和 MyClass2.php 文件中加載 *MyClass1* 和 *MyClass2* 類。
```
<?php
spl_autoload_register(function?($class_name)?{
????require_once?$class_name?.?'.php';
});
$obj??=?new?MyClass1();
$obj2?=?new?MyClass2();
?>
```
**Example #2 另一個例子**
本例嘗試加載接口 *ITest*。
```
<?php
spl_autoload_register(function?($name)?{
????var_dump($name);
});
class?Foo?implements?ITest?{
}
/*
string(5)?"ITest"
Fatal?error:?Interface?'ITest'?not?found?in?...
*/
?>
```
以上例程會輸出:
~~~
Want to load NonLoadableClass.
Unable to load NonLoadableClass.
~~~
**Example #4 自動加載在 PHP 5.3.0+ 中的異常處理 - 沒有自定義異常機制**
本例將一個異常拋給不存在的自定義異常處理函數。
```
<?php
spl_autoload_register(function?($name)?{
????echo?"Want?to?load?$name.\n";
????throw?new?MissingException("Unable?to?load?$name.");
});
try?{
????$obj?=?new?NonLoadableClass();
}?catch?(Exception?$e)?{
????echo?$e->getMessage(),?"\n";
}
?>
```
以上例程會輸出:
~~~
Want to load NonLoadableClass.
Want to load MissingException.
Fatal error: Class 'MissingException' not found in testMissingException.php on line 4
~~~
- 序言
- 簡介
- PHP是什么?
- PHP能做什么?
- 基本語法
- 類型
- boolean(布爾型)
- integer(整型)
- float(浮點型)
- string(字符串)
- array(數組)
- object(對象)
- callable(可調用)
- resource(資源)
- NULL(無類型)
- 偽類型
- 類型轉換的判別
- 變量
- 基礎
- 預定義變量
- 變量范圍
- 可變變量
- 來自PHP之外的變量
- 常量
- 語法
- 魔術常量
- 表達式
- 運算符
- 運算符優先級
- 算術運算符
- 賦值運算符
- 位運算符
- 比較運算符
- 錯誤控制運算符
- 執行運算符
- 遞增/遞減運算符
- 邏輯運算符
- 字符串運算符
- 數組運算符
- 類型運算符
- 流程控制
- if
- else
- elseif/else if
- 流程控制的替代語法
- while
- do-whille
- for
- foreach
- break
- continue
- switch
- declare
- return
- require
- include
- require_once
- include_once
- goto
- 函數
- 用戶自定義函數
- 函數的參數
- 返回值
- 可變函數
- 內部 (內置)函數
- 匿名函數
- 類與對象
- 簡介
- 基本概念
- 屬性
- 類的自動加載
- 構造函數
- 訪問控制(可見性)