在編寫面向?qū)ο螅∣OP) 程序時(shí),很多開發(fā)者為每個(gè)類新建一個(gè) PHP 文件。 這會(huì)帶來一個(gè)煩惱:每個(gè)腳本的開頭,都需要包含(include)一個(gè)長長的列表(每個(gè)類都有個(gè)文件)。
spl_autoload_register() 函數(shù)可以注冊任意數(shù)量的自動(dòng)加載器,當(dāng)使用尚未被定義的類(class)和接口(interface)時(shí)自動(dòng)去加載。通過注冊自動(dòng)加載器,腳本引擎在 PHP 出錯(cuò)失敗前有了最后一個(gè)機(jī)會(huì)加載所需的類。
PHP 8.0.0 之前,可以使用 __autoload() 自動(dòng)加載類和接口。然而,它是 spl_autoload_register() 的一種不太靈活的替代方法,并且 __autoload() 在 PHP 7.2.0 起棄用,在 PHP 8.0.0 起移除。
示例 #1 自動(dòng)加載示例
本例嘗試分別從 MyClass1.php
和 MyClass2.php 文件中加載
MyClass1
和
MyClass2
類。
<?php
spl_autoload_register(function ($class_name) {
require_once $class_name . '.php';
});
$obj = new MyClass1();
$obj2 = new MyClass2();
?>
示例 #2 另一個(gè)例子
本例嘗試加載接口 ITest
。
<?php
spl_autoload_register(function ($name) {
var_dump($name);
});
class Foo implements ITest {
}
/*
string(5) "ITest"
Fatal error: Interface 'ITest' not found in ...
*/
?>
示例 #3 自動(dòng)加載異常處理
本例拋出一個(gè)異常并在 try/catch 語句塊中演示。
<?php
spl_autoload_register(function ($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";
}
?>
以上例程會(huì)輸出:
Want to load NonLoadableClass. Unable to load NonLoadableClass.
示例 #4 自動(dòng)加載異常處理 - 沒有自定義異常機(jī)制
本例將一個(gè)異常拋給不存在的自定義異常處理函數(shù)。
<?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";
}
?>
以上例程會(huì)輸出:
Want to load NonLoadableClass. Want to load MissingException. Fatal error: Class 'MissingException' not found in testMissingException.php on line 4