include、require、include_once、require_once是php仅有的四种合法文件包含机制;include和require区别在于错误级别(e_warning继续执行 vs e_compile_error终止),_once后缀确保同一请求内不重复包含。

include、require、include_once、require_once 这四个函数就是 PHP 文件包含的全部合法写法,没有其他“更高级”或“替代性”的语法。选哪个,取决于你对错误容忍度和重复加载的控制需求。
什么时候用 include 而不是 require
当被包含的文件不是核心逻辑,缺失时脚本还能继续跑下去,就用 include。比如页面侧边栏、用户头像渲染片段、可选的统计代码等。
-
include报的是E_WARNING,脚本不会中断,后续代码照常执行 -
require报的是E_COMPILE_ERROR级别错误,直接 halt,连finally都不进 - 常见误用:在配置文件(如
config.php)里用include—— 一旦路径错或文件删了,程序可能静默失败,后面数据库连接全崩却没提示 - 相对路径行为容易踩坑:
include 'lib/utils.php'是从当前工作目录(getcwd())开始找,不是从当前 PHP 文件所在目录;加./可强制以当前文件为基准:include './lib/utils.php'
include_once 和 require_once 的真实作用域限制
它们只防「同一请求生命周期内」的重复包含,不是全局去重,也不能跨进程/跨请求生效。
- 如果 A.php
include_once 'funcs.php',B.php 也include_once 'funcs.php',且两者被不同 HTTP 请求调用,各自都会加载一次 - 但如果 A.php 同时
include_once 'funcs.php'两次,第二次会被跳过 - 注意:类/函数重复定义报错(
Fatal error: Cannot redeclare ...)通常是因为没用_once版本,而不是路径写错了 - 不要指望
include_once能解决自动加载冲突 —— Composer 的autoload是另一套机制,和它无关
file_get_contents 和 include 的本质区别
很多人混淆“读文件内容”和“执行 PHP 代码”,这是两类完全不同的操作。
-
include 'config.php':把config.php当作 PHP 代码执行,里面定义的变量、函数、return值都进入当前作用域 -
file_get_contents('config.php'):只是把文件原样读成字符串,不会解析其中的<?php标签,也不会执行任何逻辑 - 想安全读取配置又不想执行?用
parse_ini_file()或 JSON/YAML 解析器,别硬上include - 用
file_get_contents读 PHP 文件再eval()是严重安全隐患,生产环境禁止出现
file_put_contents 写入时的 flag 组合陷阱
写日志、缓存或临时文件时,FILE_APPEND | LOCK_EX 看似稳妥,但实际并发下仍有风险。
-
LOCK_EX只锁当前写操作,不锁读;多个进程同时file_get_contents+file_put_contents仍可能覆盖 -
FILE_APPEND在底层是fopen(..., 'a'),它保证追加原子性,但如果你先读再拼接再写,就失去原子性 - 真正安全的追加日志应直接用
error_log($msg, 3, $file)或fopen(..., 'a') + fwrite() + fclose(),避免中间状态 - 写配置文件别用
file_put_contents直接覆盖 —— 万一写到一半磁盘满,原配置就丢了;应先写临时文件,再rename()
include_path 开启后,include 'db.php' 可能从任意目录加载,连 get_included_files() 都不一定能立刻帮你定位到真实来源。php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











