php - 包含辅助方法 - 全局变量
问题描述
在 PHP7 应用程序中,我创建了辅助方法来包含我的模板文件。
class Templates
{
public static function Load($name)
{
include Config::template_dir."/tpl.{$name}.php";
}
}
$var = "Item";
Templates::Load("menu");
并且tpl.menu.php
只是
<?=$var?>
但是,这不起作用(未定义变量$var
),因为$var
在内部不可见Load
。如何通过方法使用此解决方案Load
,但能够在包含的文件中使用全局变量?我不喜欢将 include 直接放入我的代码中,因为它看起来并不干净。
解决方案
当你调用 include 时,被包含的代码会继承它被包含的范围。因此,如果您想读取在包含代码之外创建的数据,数据需要在本地范围内,您可以使用 global 关键字或引用 $_GLOBAL 超全局变量将全局变量带入本地范围。然而,这是解决问题的错误方法。包含代码时的另一种行为是立即评估代码。撇开污染全局命名空间的问题不谈,这可能会在您的应用程序中产生安全问题 - 如果包含文件可通过 URL 直接访问,则有人可以调用该功能,绕过调用代码中的约束(例如检查身份验证) "include" 通过指定包含文件的 URL,例如
HTTPS://example.com/include/user_admin.inc.php
解决问题的正确方法是最小化包含文件中的内联代码,在类或函数中声明所需的功能,在包含后显式地在调用代码中调用该功能。请注意,您可以从包含在内时执行的内联代码中返回一个值,因此无需实现所包含功能的每一位细节的解决问题的一种方法是:
$fn=include Config::template_dir."/tpl.{$name}.php";
$fn($var);
推荐阅读
- java - 我的 java 程序在 netbeans 中运行,但不会在命令中或通过 jar 文件运行。我究竟做错了什么?
- java - Hibernate 无法获取子实体
- onenote - 将纵向和横向打印交替打印到 OneNote
- scala - 使用 scala 宏来操作变量声明
- python - 如何在数据框列中找到第一个和最后一个元素并修剪这些元素之间的值
- graphql - Nestjs / GraphQL - Playground 为查询返回 Null 错误。我的解析器?
- python - 关于在 Python 中的同一类属性中是否使用下划线
- java - 方法中永远不会抛出异常“java.io.FileNotFoundException”
- android - Firebase 遍历整个数据库
- angular - ViewChild 与输入/输出 - Angular 最佳实践