能用,但不推荐直接裸写路径;PHP7未废除require/include,但硬编码路径易导致Fatal error,应统一入口、合理目录结构并用__DIR__锚定路径,结合autoloader按需加载。

PHP7中require和include还能用吗?
能用,但不推荐直接裸写路径。PHP7本身没废掉这两个语句,但硬编码路径(比如require './lib/Database.php';)在项目稍大后极易出错——路径拼错、大小写敏感(Linux下)、相对路径基准混乱都会导致Fatal error: require(): Failed opening required。
真正该做的是统一入口+合理目录结构+使用__DIR__锚定位置:
-
__DIR__永远返回当前文件所在目录的绝对路径,比dirname(__FILE__)更简洁安全 - 避免用
.或..拼接,改用__DIR__ . '/../src/Helper.php' - 如果类文件有命名空间,仅
require还不够,必须同时use或全限定调用
为什么autoloader是PHP7项目的标配?
手动require几十个类文件既重复又易漏,而PHP7的spl_autoload_register()机制能按需加载——类名一出现,自动找对应文件,不用提前写一堆require。
一个最小可用示例:
立即学习“PHP免费学习笔记(深入)”;
// 在入口文件(如 index.php)中注册
spl_autoload_register(function ($class_name) {
$file = __DIR__ . '/src/' . str_replace('\', '/', $class_name) . '.php';
if (file_exists($file)) {
require $file;
}
});
注意点:
- 命名空间分隔符
要替换成/,否则路径会错(Windows下也建议统一用/) - 确保
$file路径真实存在,否则静默失败——加file_exists()判断比让PHP报Class not found更容易定位问题 - 不要在
spl_autoload_register()里抛异常,它只负责加载,不负责验证类是否真被定义
Composer autoload配置怎么写才不踩坑?
如果你用Composer,别手写autoload逻辑——它的composer.json已经提供成熟方案,但容易配错:
-
"psr-4"映射必须以\结尾(如"App\": "src/"),少这个反斜杠会导致类名解析错位 - 目录路径是相对于
composer.json位置的,不是相对于webroot或入口文件 - 改完
composer.json后必须运行composer dump-autoload,否则新规则不生效 - 如果类文件名和类名不严格匹配(比如
MyHelper.php里定义了class MyHelper),PSR-4就失效,得切回"classmap"或手动require
PHP7里require_once还有必要吗?
有必要,但场景很窄。PHP7的opcode缓存(OPcache)会让多次require变快,但无法防止重复定义类——Fatal error: Cannot declare class XXX, because the name is already in use依然会发生。
所以:
- 配置文件、函数库这类无类定义的脚本,用
require_once防重复加载没问题 - 类文件优先走autoloader,而不是靠
require_once兜底——后者掩盖设计缺陷 - 测试时临时引入某类,可以用
require_once快速验证,但上线前应移入autoload体系
最常被忽略的一点:autoloader函数里千万别用require_once,它和spl_autoload_register的语义冲突——loader本意就是“保证只加载一次”,再套一层_once反而干扰调试。



















