
require_once 的核心作用是:**确保一个 PHP 文件在整个请求生命周期中只被加载并执行一次**。它和 require 行为一致(出错时致命报错、立即执行),但多了“去重”逻辑——PHP 会记录已包含的文件路径,再次遇到相同路径时直接跳过。
初学者常误以为 require 也能防重复,但实际不是:如果两个不同文件都 require 同一个 config.php,而该文件里定义了函数或类,就会触发 Fatal error: Cannot redeclare function_name()。
require_once,比如含 function、class、const 声明的文件$db_host = 'localhost';)理论上可用 require,但保险起见仍推荐 require_once
require_once 比 require 略慢(需查内部文件列表),但对现代 PHP 影响微乎其微,别为此妥协可维护性路径写错是初学者最常遇到的失败原因,错误现象通常是:Warning: require_once(): Failed opening required 'xxx' 或静默失效(因路径未匹配,PHP 认为是“另一个文件”)。
require_once 所在文件。例如 include/a.php 里写 require_once 'config.php',PHP 会去找 include/config.php,而非项目根目录下的 config.php
__DIR__ . '/path/to/file.php' —— __DIR__ 返回当前文件所在目录的绝对路径,稳定可靠__DIR__ . '/lib/helper.php' 正确;__DIR__ . '\lib\helper.php' 在 Linux 下会失败不冲突,但有明确分工:require_once 是手动加载,autoloader(如 Composer 的 autoload.php)是按需自动加载类。两者共存很常见,但要注意顺序和职责。
立即学习“PHP免费学习笔记(深入)”;
require_once 引入 autoloader(如 require_once __DIR__ . '/vendor/autoload.php';),再 new 类,否则类找不到require_once —— 多余且可能破坏命名空间逻辑require_once,autoloader 不处理它们以下结构能避免重复、路径错、声明冲突三类问题:
/* index.php */ <?php // 正确:用 __DIR__ 锚定路径,且只引入一次 require_once __DIR__ . '/config.php'; require_once __DIR__ . '/helpers/functions.php'; require_once __DIR__ . '/vendor/autoload.php';// 此后可安全使用 config 中的常量、functions.php 中的函数、以及 composer 包里的类 echo DB_HOST; my_helper_function(); new GuzzleHttp\Client();
真正复杂的地方不在语法,而在理解「谁在什么时候加载了什么」——尤其是当项目引入多个第三方包、自定义库、测试引导文件时,require_once 的路径和顺序一旦错位,错误信息往往不直接指向根源。多打几次 var_dump(get_included_files()); 能帮你快速看清实际加载链。