开启opcache后,循环中多次include同一文件不会重复读磁盘,仅首次解析编译;但每次仍执行文件逻辑,含函数定义会报重声明错误,路径须统一用__dir__拼接,返回值为被包含文件末行表达式结果或false。

循环里用 include 会重复读文件吗
不会反复从磁盘读取——只要 OPcache 开启(PHP 5.5+ 默认启用),同一个文件在单次请求中被 include 多次,PHP 实际只解析编译一次,后续调用直接执行内存中的 opcode。但前提是路径字符串完全一致,且没触发 realpath 缓存失效(比如混用 ./file.php 和 file.php)。
不过要注意:每次 include 都会执行一次文件内容,包括其中的变量赋值、函数定义(除非加 _once)、echo 输出等逻辑。如果文件里有 function foo() { },第二次 include 就会报 Fatal error: Cannot redeclare foo()。
- 路径必须统一,推荐用
__DIR__ . '/template/item.php'而不是拼接变量或相对路径 - 避免在循环里
include含函数/类定义的文件;若必须,改用include_once - 如果只是输出 HTML 片段,且无副作用逻辑,循环
include是安全的
include 在循环里返回值怎么处理
include 是表达式,有返回值:成功时返回被包含文件中最后一行表达式的值(如 return 'ok';),失败时返回 false。而 require 没有返回值,出错直接终止脚本。
这意味着你可以在循环里捕获结果:
$data = [];
foreach ($items as $item) {
$result = include __DIR__ . '/render_item.php';
if ($result !== false) {
$data[] = $result;
}
}
但注意:render_item.php 中的 return 会立即退出该文件执行,并把值传给 $result;它不会跳出外层循环。
- 被包含文件里不能有
exit或die,否则整个请求中断 - 如果被包含文件没有
return,$result是1(布尔 true 的整型表示) - 不依赖返回值时,直接写
include ...;即可,无需赋值
比循环 include 更稳妥的替代方案
真要渲染大量结构一致的内容(比如商品列表),硬编码循环 include 不是最佳实践——它模糊了数据与模板边界,调试困难,也难做缓存。
访问全球海洋潮汐模型。功能包括查询指定日期、时间和地点的潮高、潮汐极值及格点天气数据。
更可控的做法是把模板逻辑封装成函数或使用轻量模板方式:
- 提前
include_once模板文件,定义一个render_item($item)函数,循环里调用函数 - 用
file_get_contents()读取模板字符串,再str_replace()或eval()(不推荐eval)注入变量 - 升级到 Twig/Blade 等模板引擎,天然支持循环和作用域隔离
简单项目中,一个带参数的函数比反复 include 更易测、更少意外。
容易被忽略的路径和作用域陷阱
循环里 include 最常崩在路径和变量上,而不是性能。
比如你在 /app/list.php 中循环 include 'item.php',而 item.php 又 include 'config.php'——这时它找 config.php 的基准目录是当前工作目录(getcwd()),不是 list.php 所在目录,也不是 item.php 所在目录。
- 永远优先用
__DIR__拼路径:include __DIR__ . '/item.php'; - 不要在被包含文件里依赖未声明的变量;若需传参,显式用
extract($vars)或函数封装 -
include在函数内执行时,被包含文件里的变量默认属于该函数作用域,外部不可见
路径写错时,PHP 往往只报 Warning: include(...): failed to open stream 然后继续跑,结果页面部分缺失却没提示——开发期务必打开 error_reporting(E_ALL) 和 display_errors=On。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










