類的自動加載

在編寫面向?qū)ο螅∣OP) 程序時,很多開發(fā)者為每個類新建一個 PHP 文件。 這會帶來一個煩惱:每個腳本的開頭,都需要包含(include)一個長長的列表(每個類都有個文件)。

spl_autoload_register() 函數(shù)可以注冊任意數(shù)量的自動加載器,當使用尚未被定義的類(class)和接口(interface)時自動去加載。通過注冊自動加載器,腳本引擎在 PHP 出錯失敗前有了最后一個機會加載所需的類。

警告

PHP 8.0.0 之前,可以使用 __autoload() 自動加載類和接口。然而,它是 spl_autoload_register() 的一種不太靈活的替代方法,并且 __autoload() 在 PHP 7.2.0 起棄用,在 PHP 8.0.0 起移除。

示例 #1 自動加載示例

本例嘗試分別從 MyClass1.phpMyClass2.php 文件中加載 MyClass1MyClass2 類。

<?php
spl_autoload_register
(function ($class_name) {
    require_once 
$class_name '.php';
});

$obj  = new MyClass1();
$obj2 = new MyClass2();
?>

示例 #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 ...
*/
?>

示例 #3 自動加載異常處理

本例拋出一個異常并在 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";
}
?>

以上例程會輸出:

Want to load NonLoadableClass.
Unable to load NonLoadableClass.

示例 #4 自動加載異常處理 - 沒有自定義異常機制

本例將一個異常拋給不存在的自定義異常處理函數(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";
}
?>

以上例程會輸出:

Want to load NonLoadableClass.
Want to load MissingException.

Fatal error: Class 'MissingException' not found in testMissingException.php on line 4