PHP 8.0 彻底移除了已废弃的 __autoload 函数,必须替换为 spl_autoload_register() 或使用 Composer 自动加载,否则触发致命错误。

PHP 8.0 升级后出现 __autoload 报错,不是代码写错了,而是这个函数已被**彻底移除**——它从 PHP 7.2 起被废弃,到 PHP 8.0.0 正式删除。只要代码里还直接定义或调用了 __autoload(),就会触发 Fatal error: Uncaught Error: Call to undefined function __autoload(),页面直接空白。
确认是否还在用 __autoload
搜索整个项目(尤其是入口文件、公共函数库、旧扩展)是否有类似下面的代码:
function __autoload($class) { ... }-
spl_autoload_register('__autoload');(这种注册也无效了)
只要存在,就必须替换。PHP 8.0 不再识别它,也无法降级兼容。
统一改用 spl_autoload_register
这是 PHP 官方推荐且唯一支持的自动加载机制,兼容 PHP 5.1+,在 PHP 8.0 下完全可靠:
立即学习“PHP免费学习笔记(深入)”;
修复 Core bailout 状态损坏安全问题,以及 BZ2、DOM、PDO、Opcache/JIT 内存与执行错误,改进 Unicode 字素处理、URL 解析、TLS 流状态、信号分发及会话错误处理。
- 删掉所有
__autoload函数定义 - 用
spl_autoload_register()注册一个或多个加载回调,例如:
spl_autoload_register(function ($class) {
$file = __DIR__ . '/lib/' . str_replace('\', '/', $class) . '.php';
if (file_exists($file)) {
require_once $file;
}
});
优先使用 Composer 自动加载
如果你的项目已用 Composer(绝大多数 ThinkPHP、Laravel 等现代框架都依赖它),就**不要手写 autoload 逻辑**:
- 确保
composer.json中正确配置了"autoload"(如 PSR-4 映射) - 运行
composer dump-autoload刷新映射 - 在入口文件顶部只保留一行:
require __DIR__ . '/vendor/autoload.php';
Composer 的 autoloader 内部就是基于 spl_autoload_register 实现的,健壮、高效、无需维护。
检查第三方库或旧插件是否含 __autoload
有些老版本 SDK、支付类库、国产 CMS 插件可能仍残留 __autoload。升级前可做两件事:
- 用命令快速扫描:
grep -r "__autoload" ./ --include="*.php" - 替换方案:对不维护的库,可临时加一层兼容封装(仅限过渡):
function __autoload($class) {
spl_autoload_call($class);
}
}
⚠️注意:这只是让脚本不崩,不能解决根本问题;应尽快升级或替换该库。


















