spl_autoload() 不是默认启用的自动加载器,必须显式注册(如 spl_autoload_register('spl_autoload'))才生效;它仅在 include_path 中查找 $class.'.php' 或 .inc 文件,功能单一且不支持命名空间、多路径等现代需求,而 spl_autoload_register() 才是 PHP 5.1.2 起推荐的标准方式,支持多加载器、PSR-4 兼容及灵活路径映射。

PHP 5.4 中已不再使用 `spl_autoload` 作为默认自动加载器,也不推荐直接调用它。从 PHP 5.1.2 起,`spl_autoload_register()` 成为标准方式;而 `spl_autoload()` 本身只是一个内置的、简单的默认加载函数,**它不会被自动启用**,必须显式注册或手动调用才起作用。
为什么不能依赖 spl_autoload 的“默认行为”?
`spl_autoload()` 是 SPL 提供的一个基础函数,功能很有限:
- 它只尝试在
include_path中查找$class_name . '.php'或$class_name . '.inc'文件; - 它不会自动注册,也不会在类未定义时自动触发;
- 只有当你显式调用
spl_autoload('MyClass'),或通过spl_autoload_register()注册它(如spl_autoload_register('spl_autoload')),它才会参与自动加载流程; - PHP 5.4 并没有“默认启用”的自动加载器——
__autoload需要你手动定义,而spl_autoload_register才是真正启用自动加载的入口。
PHP 5.4 推荐做法:用 spl_autoload_register 注册加载逻辑
这是唯一可靠、可扩展、兼容多库的方式。例如:
<?php
spl_autoload_register(function ($class) {
$file = 'classes/' . $class . '.php';
if (file_exists($file)) {
require_once $file;
}
});
$obj = new Database(); // 自动加载 classes/Database.php
?>
立即学习“PHP免费学习笔记(深入)”;
- 支持多个加载器叠加(比如框架 + 自己的类 + 第三方库);
- 避免
__autoload函数重定义冲突; - 可自由控制文件路径规则(如支持下划线转目录、命名空间转路径等)。
如果坚持用 spl_autoload,怎么让它工作?
它不是“默认运行”,但可以手动注册为一个加载器:
<?php
// 启用 SPL 默认加载逻辑(仅查找 include_path 下的 .php/.inc)
spl_autoload_register('spl_autoload');
// 确保 include_path 包含你的类目录
$obj = new User(); // 尝试加载 User.php
?>
- 注意:
spl_autoload不解析命名空间,不处理下划线分隔符,也不支持自定义后缀; - 实际项目中几乎不用这种方式,因灵活性太差、路径管理困难。
重要提醒:__autoload 已过时,不要用
PHP 5.4 支持 __autoload,但它在 PHP 7.2+ 被废弃、PHP 8.0+ 彻底移除。即使在 5.4 中,也应避免使用,理由明确:
- 全局函数只能定义一次,第三方库极易冲突;
- 无法调试顺序、无法禁用、无法组合多个策略;
- 所有现代实践(包括 PSR-0/PSR-4、Composer)都基于
spl_autoload_register。



















