在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直接放入我的代码中,因为它看起来并不干净。
答案 0 :(得分:0)
由于您将文件包含在函数中,因此无法访问全局变量。您需要一个global
声明。 tpl.menu.php
必须为:
<?php global $var; echo $var; ?>
答案 1 :(得分:0)
调用include时,包含的代码将继承其包含位置的范围。因此,如果要读取在包含代码之外创建的数据,则数据必须位于本地范围内,并且可以使用global关键字或引用$ _GLOBAL超全局变量将全局变量带入本地范围。但是,这是解决问题的错误方法。包含代码时的另一行为是立即评估代码。撇开污染全局名称空间的问题,这可能会在您的应用程序中引发安全问题-如果可以通过URL直接访问包含文件,则有人可以调用该功能,而绕过调用该代码的约束(例如检查身份验证)只需指定包含文件的网址即可“包含”,例如
HTTPS://example.com/include/user_admin.inc.php
解决问题的正确方法是最小化包含文件中的内联代码,在类或函数中声明所需的功能,在将其包含后在调用代码中显式调用该功能。请注意,您可以从包含该代码时执行的内联代码中返回一个值,因此一种解决问题而无需实现所包含功能每一位细节的方法是:
$fn=include Config::template_dir."/tpl.{$name}.php";
$fn($var);
答案 2 :(得分:0)
我已经用可变长度参数列表解决了这个问题
public static function LoadWithParams($name, ...$args)
{
foreach ($args as $n)
{
${key($n)} = array_pop($n);
}
include Config::template_dir."/tpl.{$name}.php";
}
然后致电
Templates::LoadWithParams("head", ["x" => $x]);