require_once 应该是第一选择,因它确保文件存在且不重复加载,避免重定义错误,路径基于 realpath,适合中小型项目;include 仅适用于可选内容,但会重复解析;应统一用 DIR 构造绝对路径;自动加载需待项目结构成熟后再引入。

用 require_once 引入类、函数库或配置文件,是当前 PHP 项目中最稳妥的默认选择;其他方式只在明确需要宽松容错或动态加载时才考虑。
为什么 require_once 应该是你的第一选择
它同时满足两个关键约束:文件必须存在(否则脚本终止),且不会重复加载(避免 Cannot redeclare function 或 Class 'X' already declared 错误)。尤其在 Composer 未介入的中小型项目中,这是防止“本地跑通、上线报错”的最简单防线。
-
require_once的路径判定基于文件真实路径(realpath),即使你写./config.php和config.php,PHP 内部也只算一次 - 它不返回值,也不支持赋值(
$res = require_once 'x.php';是无效写法) - 如果被包含文件中有
return语句,require_once会返回那个值,但这种用法极少见,且容易混淆职责
include 适合什么场景,以及它怎么悄悄埋雷
include 唯一不可替代的用途是加载可选内容——比如页面侧边栏、用户自定义模板片段、A/B 测试用的备用逻辑。它失败时只抛 E_WARNING,脚本继续,页面还能渲染主体部分。
- 但它会**每次执行都重新解析文件**,哪怕同一文件在循环里被
include十次,PHP 就 parse 十次,性能开销明显 - 如果被包含文件里定义了函数(如
function render_sidebar() { ... }),第二次include就直接 fatal error - 绝对不要用
include加载函数库或类——这等于把错误延迟到运行时才暴露
路径写错,require_once 和 include 都救不了你
相对路径(如 ../lib/utils.php)依赖当前工作目录(getcwd()),而这个值可能被 chdir()、框架路由中间件甚至某些 CLI 工具修改。结果就是本地测试正常,部署后突然报 failed to open stream。
立即学习“PHP免费学习笔记(深入)”;
- 统一用
__DIR__ . '/path/to/file.php'构造绝对路径,__DIR__永远指向当前文件所在目录,稳定可靠 - 避免
dirname(__FILE__)——它和__DIR__等价,但多打 6 个字符,且易拼错 - 不要依赖
include_path:它需要修改 php.ini 或反复调用set_include_path(),增加环境耦合
自动加载不是“高级替代”,而是结构分层后的自然选择
当项目开始用命名空间、按 PSR-4 组织目录(如 src/Http/Request.php 对应 App\Http\Request),spl_autoload_register() 才真正值得投入。在此之前硬上自动加载,只会让调试变得更绕。
-
__autoload()已废弃(PHP 7.2+),必须用spl_autoload_register() - 自动加载器里别用
include,一律用require或require_once——类加载失败本就不该静默 - Composer 自动生成的 autoload.php 本质就是个封装好的
spl_autoload_register,直接require_once 'vendor/autoload.php'即可
最常被忽略的一点:所有这四种方式(include/require/include_once/require_once)都是在**解析阶段**将目标文件内容复制进当前作用域,而不是运行时“调用”。这意味着被包含文件里的 return、global、define() 全部生效,但变量作用域仍受 PHP 函数/块级作用域规则约束——这点在调试跨文件变量可见性时,很容易卡住几小时。



















