include或require语句需用相对于当前执行文件的路径,如require 'includes/header.php';;Linux区分大小写,须检查文件名;建议用require防页面空白,并加file_exists()和is_readable()校验。

include语句本身怎么写才不出错
直接用include或require时,路径错误和权限问题是头号拦路虎。不是语法写错,而是路径没对上、文件读不到。
-
include失败只发警告,脚本继续跑;require失败直接中断——线上环境建议用require,避免页面半截空白还不报错 - 路径必须是相对于当前执行文件(不是当前模板文件)的路径。比如
index.php在根目录,includes/header.php在子目录,就得写require 'includes/header.php';,不能写require 'header.php'; - Linux服务器严格区分大小写:
Header.php和header.php是两个文件,写错就是failed to open stream - 安全起见,加一层存在性检查:
if (file_exists($path) && is_readable($path)) { require $path; }
被包含的模板文件里能写什么
被include的文件(如header.php)不是独立页面,它只是HTML+PHP片段,不能带、、这些顶层标签。
- 正确示例:
<header class="site-header"><h1><?php echo htmlspecialchars($title ?? '首页'); ?></h1></header> - 错误做法:在
header.php里写——会导致最终页面出现多个,页脚被内容顶飞 - 变量直接可用,但要防未定义:
$user_name可能为空,输出前先isset()或用空合并操作符?? - 别在模板里写
session_start()或header(),这类控制逻辑应前置到主文件或控制器
ThinkPHP等框架里的{include}和原生include不是一回事
ThinkPHP的{include}是模板引擎层的语法,不走PHP的include_path,也不认./或../,路径规则完全不同。
- 写
{include file="/public/header"}才对——开头的/表示从view/根目录找,对应view/public/header.html -
{include file="public/header"}会去当前模块子目录下找,比如view/index/public/header.html,极易跨模块出错 - 传参只能用键值对形式:
{include file="/public/header" title="首页" user_id=$user.id},不能传data=[...]这种PHP数组字面量 - CSS/JS路径崩了?不是
{include}的问题,是<link href="css/app.css">被浏览器按当前URL解析了——必须用<link href="%7B__STATIC__%7D/css/app.css">
为什么include后变量突然变多了或重复递增
模板被多次include(比如公共片段又被子模板引入),而计数器类变量没做初始化保护,就会累加异常。
立即学习“PHP免费学习笔记(深入)”;
- 循环内递增必须显式初始化:
<?php $i = 0; foreach ($items as $item): $i++; ?>...,不能只写$i++ - 避免在
header.php或footer.php里写$counter++——一旦这个文件被引入两次,$counter就加两次 - 更稳妥的做法是把序号交给循环本身:
foreach ($items as $key => $item),用$key + 1当序号,不依赖外部变量 - 如果真要用全局计数器,至少加判断:
$counter = isset($counter) ? $counter + 1 : 1;
$i++,可能在你不注意的时候被执行了三次。



















