PHP的spl_autoload_extensions在生产服务器无法自动加载类如何解决
问题根因
该差异由两个规则共同导致:
- Windows系统文件名不区分大小写,而生产环境的Linux系统严格区分文件名大小写
- 调用
spl_autoload_register()不传入自定义函数时,PHP默认使用的spl_autoload()实现会自动将类名转为全小写后,再拼接配置的扩展名查找文件
你的类名为Filter,类文件名为Filter.class.php,Windows下转小写后的filter依然能匹配到原文件,Linux下只会查找filter.class.php,因此加载失败。
你可以先做快速验证:将服务器上的Filter.class.php复制一份重命名为filter.class.php,原来的代码即可正常运行,确认是该问题。
解决方案
方案一:统一文件命名规则
将class目录下所有类文件统一改为全小写命名,无需修改代码即可适配默认自动加载逻辑。
方案二:保留原文件名,修改自动加载逻辑
如果不想调整现有文件名,只需注册兼容大小写的加载逻辑即可,写法简洁同时保留spl_autoload_extensions的配置能力:
set_include_path(get_include_path() . PATH_SEPARATOR . getenv('DOCUMENT_ROOT') . '/class/'); spl_autoload_extensions('.class.php'); // 替换默认加载逻辑,不转换类名大小写 spl_autoload_register(function(string $className) { $path = stream_resolve_include_path(str_replace('\\', '/', $className) . '.class.php'); if ($path) require_once $path; });
内容的提问来源于stack exchange,提问作者theking2
相关产品推荐
相关产品推荐

