require是语言构造而非函数,编译时内联文件,失败即终止;支持返回值(需被包含文件return),require_once仅首次执行并返回,路径用__DIR__拼接最高效。

require 会中止脚本,但不是函数
require 不是函数,而是语言构造(language construct),和 echo、isset 一样,括号可加可不加:require 'config.php' 和 require('config.php') 完全等价。它在编译阶段就尝试把目标文件内容“内联”进当前脚本,一旦失败(如文件不存在、语法错误),直接抛出 E_COMPILE_ERROR 并终止执行——不会留给你 catch 的机会。
require 能返回值,但必须靠被包含文件主动 return
很多人以为 require 没有返回值,其实不然:如果被包含的 PHP 文件以 return 语句结尾(且返回非 null 值),整个 require 表达式就等于那个返回值。这是 Slim 4、Laravel 等框架入口写法的基础:
(require __DIR__ . '/../config/bootstrap.php')->run();
关键点在于 bootstrap.php 必须有这一行:
return $app;
- 没
return→require表达式结果为null→ 调用->run()报Fatal error: Call to a member function run() on null - 有
return但返回的是false或0→ 表达式值就是该值,但后续方法调用仍会失败 -
require_once同样支持返回值,只要目标文件只加载过一次且含return
路径写法决定 include_path 是否生效
PHP 查找文件时,是否走 include_path 取决于你写的路径形式:
立即学习“PHP免费学习笔记(深入)”;
- 绝对路径(
/var/www/app/config.php或C:\xampp\htdocs\config.php)→ 完全忽略include_path,直接读取 - 目录相对路径(
./config.php、../lib/db.php)→ 也跳过include_path,只在当前工作目录解析 - 纯文件名(
config.php)→ 才依次搜索include_path中所有目录,最后 fallback 到当前脚本所在目录
性能上,带 include_path 的查找最差可能试 10+ 次才命中;而绝对路径或 __DIR__ 拼接是最快、最确定的方式。线上环境强烈建议用 require __DIR__ . '/config/database.php' 这类写法。
require_once 不只是防重复,还影响返回值语义
require_once 本质是“首次 require 成功后,后续同路径调用直接跳过”。这意味着:
- 第二次
require_once 'foo.php'不会执行文件内容,也不会触发任何返回值 - 如果第一次
require_once返回了对象,第二次调用表达式值仍是null(因为没执行 return) - 不要指望靠多次
require_once来“刷新”配置或重载实例——它只保证定义不冲突,不保证逻辑可重入
真正容易被忽略的是:当多个模块各自用 require_once 加载同一个工具类,但又依赖其内部静态状态时,行为可能和预期不一致——因为类已定义,但初始化逻辑只跑了一次。



















