array ( 0 => 'index.php', 1 => 'PHP Manual', ), 'head' => array ( 0 => 'UTF-8', 1 => 'zh', ), 'this' => array ( 0 => 'language.oop5.autoload.php', 1 => '类的自动加载', ), 'up' => array ( 0 => 'language.oop5.php', 1 => '类与对象', ), 'prev' => array ( 0 => 'language.oop5.constants.php', 1 => '类常量', ), 'next' => array ( 0 => 'language.oop5.decon.php', 1 => '构造函数和析构函数', ), 'alternatives' => array ( ), 'source' => array ( 'lang' => 'zh', 'path' => 'language/oop5/autoload.xml', ), ); $setup["toc"] = $TOC; $setup["toc_deprecated"] = $TOC_DEPRECATED; $setup["parents"] = $PARENTS; manual_setup($setup); ?>
在编写面向对象(OOP) 程序时,很多开发者为每个类新建一个 PHP 文件。 这会带来一个烦恼:每个脚本的开头,都需要包含(include)一个长长的列表(每个类都有个文件)。
spl_autoload_register() 函数可以注册任意数量的自动加载器,当使用尚未被定义的类(class)和接口(interface)时自动去加载。通过注册自动加载器,脚本引擎在 PHP 出错失败前有了最后一个机会加载所需的类。
像 class 一样的结构都可以以相同方式自动加载。包括类、接口、trait 和枚举。
PHP 8.0.0 之前,可以使用 __autoload() 自动加载类和接口。然而,它是 spl_autoload_register() 的一种不太灵活的替代方法,并且 __autoload() 在 PHP 7.2.0 起弃用,在 PHP 8.0.0 起移除。
注意:
spl_autoload_register() 可以多次调用以便注册多个自动加载器。但从自动加载函数中抛出异常会中断该过程并且禁止继续执行。因此强烈建议不要从自动加载函数中抛出异常。
示例 #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();
?>
示例 #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 ...
*/
?>