包含在辅助方法中-全局变量

时间:2019-01-19 19:21:03

标签: php include

在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),因为$varLoad内部不可见。如何通过Load方法使用此解决方案,但如何在包含的文件中使用全局变量?我不喜欢将include直接放入我的代码中,因为它看起来并不干净。

3 个答案:

答案 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]);