本文讲解在无框架的轻量 php 结构中,如何确保控制器中准备的数组(如 `$tpl["results"]`)能被视图安全访问,避免 `invalid argument supplied for foreach()` 错误,并提供变量作用域、空值防御与加载顺序的关键实践。
在典型的简易 PHP MVC 模式(非 Laravel/CodeIgniter 等框架)中,“控制器 → 视图”的数据传递依赖于 PHP 的变量作用域继承机制:include 或 require 的文件会继承其所在行的局部变量作用域。这意味着——视图文件必须在控制器完成数据赋值之后才被引入,否则 $TPL["results"] 在视图中尚未定义或为 null,导致 foreach 报错。
你原始代码的问题根源正在于此:
PHP 执行是自上而下线性的。include "app.view.php" 提前触发了视图渲染逻辑,而此时 $TPL["results"] 尚未初始化,因此 var_dump($TPL["results"]) 在视图中为空,foreach 自然抛出警告。
✅ 正确做法是:先准备数据,再引入视图:
? 补充说明:?? [](PHP 7+ 空合并操作符)等价于 isset($x) ? $x : [],可防止 readAllEntries() 返回 null 或 false 时导致 foreach 失败,大幅提升健壮性。
在视图中,你还可以进一步增强安全性:
DE
= htmlspecialchars($entry['id'] ?? '') ?>
= htmlspecialchars($entry['lname'] ?? '') ?>
= htmlspecialchars($entry['fname'] ?? '') ?>
= htmlspecialchars($entry['email'] ?? '') ?>
= htmlspecialchars($entry['phone'] ?? '') ?>
暂无数据
⚠️ 注意事项:
总结:PHP 的 include 不是“跳转”,而是“嵌入执行”
