include_once依据规范化绝对路径判断是否已加载,非代码行重复;路径需用__dir__拼接防错;失败仅警告,不防函数重定义;require_once则致命报错。

include_once 会检查文件是否已被加载,不是检查“有没有写过这行代码”
很多人以为 include_once 是看当前脚本里有没有重复写过同一行语句,比如写了两次 include_once 'config.php'; 就只执行一次——其实不是。它的判断依据是「该文件的**规范化绝对路径**是否已在 PHP 内部的 EG(included_files) 列表中」。
这意味着:
- 即使你用不同写法引入同一个文件(比如
include_once './config.php';和include_once 'config.php';),PHP 5+ 也会归一化为相同路径,只加载一次 - 但如果你在 Windows 上用大小写混搭(如
include_once 'Config.php';和include_once 'config.php';),PHP 4 会当成两个文件,PHP 5+ 已修复 -
include_once不关心变量名或条件分支,哪怕你把它包在if (false)里,只要执行到这一行,它仍会触发路径检查和可能的加载
相对路径容易出问题,优先用 __DIR__ 拼绝对路径
写成 include_once 'lib/database.php'; 看似简单,但实际行为取决于当前工作目录(getcwd())、include_path 配置、以及是否被 chdir() 改过——这些都可能导致找不到文件或加载错版本。
更稳的做法是:
访问全球海洋潮汐模型。功能包括查询指定日期、时间和地点的潮高、潮汐极值及格点天气数据。
- 用
__DIR__或dirname(__FILE__)获取当前文件所在目录,再拼路径:include_once __DIR__ . '/lib/database.php'; - 避免使用
./或../开头的相对路径,它们依赖运行时工作目录,不可靠 - 如果必须动态拼路径,记得用
realpath()标准化,防止符号链接或多余..导致路径不一致
include_once 失败时只是警告,但函数/类重定义错误是致命的
include_once 在文件不存在时发出 E_WARNING,脚本继续执行;但它**无法阻止你手动重复定义同名函数或类**。比如:
include_once 'a.php'; // 定义了 function helper() { }
include_once 'b.php'; // 也定义了 function helper() { } → 致命错误:Cannot redeclare helper()
所以要注意:
-
include_once只保证「同一个物理文件」不重复加载,不保证「逻辑上等价的代码」不冲突 - 多个文件之间仍需约定命名空间、前缀或使用
function_exists()做运行时保护 - 如果文件里有顶层变量赋值(如
$cfg = [];),重复包含(哪怕用了_once)不会覆盖,但多次include会,这点常被忽略
和 require_once 的关键区别不在“是否报错”,而在“错误级别”
include_once 和 require_once 都只加载一次,但失败时处理方式不同:
-
include_once 'missing.php';→ 触发E_WARNING,返回false,脚本继续 -
require_once 'missing.php';→ 触发E_COMPILE_ERROR,脚本立即中止 - 两者对已加载文件的判断逻辑完全一致,性能差异可忽略
- 选哪个取决于你对缺失文件的容忍度:配置类、工具函数可用
include_once;核心启动文件、数据库连接必须用require_once
include_once 那一刻。这意味着,如果某个文件通过 symlink 引入,而 symlink 目标后来被替换,PHP 仍按原始解析时的路径做去重判断。php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










