如何正确使用PHP模板 StdClass传参未定义变量报错解决
报错原因
两个警告都来自模板文件page.php的写法错误,具体问题点:
- 属性访问多写了$符号:第9行写的
$pageData->$content是错误写法,对象属性名前不需要加$,多写的$会让PHP将其识别为可变属性——即先查找名为$content的变量,用该变量的值作为属性名访问对象,但当前作用域从未定义$content变量,就会触发Undefined variable $content警告。 - 双引号内变量解析边界不明确:PHP双引号解析变量时,遇到
$obj->prop这类带对象操作符的写法,无法自动准确识别变量的起止位置,必须用大括号{}把整个变量表达式包裹,明确告知PHP解析范围,否则PHP会错误拆分变量名,尝试单独解析$title变量,触发Undefined variable $title警告。
修正后的page.php代码如下:
<?php return "<!DOCTYPE html> <html> <head> <title>{$pageData->title}</title> <meta http-equiv='Content-Type' content='text/html;charset=utf-8'/> </head> <body> {$pageData->content} </body> </html>";
替换后运行就不会再出现警告。
新手友好的简易PHP模板写法
不建议新手一开始就用「PHP文件返回拼接好的HTML字符串」的写法,很容易出现字符串解析错误,可读性也差。用原生PHP做模板最朴素的方式就足够好用,核心原则是:业务逻辑全在入口文件处理,模板文件只负责输出HTML和展示数据,不要在模板里写复杂逻辑。
具体写法:
- 入口文件
index.php处理完所有数据后,直接引入模板文件,不需要接收返回值:
<?php error_reporting( E_ALL ); ini_set("display_errors", 1); $pageData = new stdClass(); $pageData->title = "Test title"; $pageData->content = "<h1>Hello World</h1>"; // 引入模板后会直接输出渲染好的页面 include "templates/page.php";
- 模板文件
page.php直接写HTML代码,需要输出动态数据的位置,用PHP短输出标签<?= ?>嵌入变量即可,完全不需要拼接字符串,也不会出现变量解析错误:
<!DOCTYPE html> <html> <head> <title><?= htmlspecialchars($pageData->title) ?></title> <meta http-equiv='Content-Type' content='text/html;charset=utf-8'/> </head> <body> <?= $pageData->content ?> </body> </html>
小提示:输出普通用户输入的文本时,一定要用htmlspecialchars()函数处理内容,避免XSS安全漏洞;如果是你自己提前写好的可信HTML片段(比如示例里存的h1标签内容),可以直接输出,等后续学习Web安全相关内容时再深入了解细节即可。
内容的提问来源于stack exchange,提问作者Holly Rose
相关产品推荐
相关产品推荐

