包含辅助方法 - 全局变量

Include with helper method - global variables

在 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 直接放入我的代码中,因为它看起来不干净。

由于您将文件包含在函数中,因此它无法访问全局变量。您需要一个 global 声明。 tpl.menu.php 需要是:

<?php global $var; echo $var; ?>

当您调用 include 时,被包含的代码会继承它被包含的范围。因此,如果你想读取在包含代码之外创建的数据,数据需要在本地范围内,你可以使用 global 关键字或通过引用 $_GLOBAL 超全局变量将全局变量引入本地范围。然而,这是错误的解决问题的方法。包含代码时的另一种行为是立即评估代码。撇开污染全局命名空间的问题不谈,这可能会在您的应用程序中产生安全问题 - 如果包含文件可以通过 URL 直接访问,则有人可以调用该功能,绕过约束(例如检查身份验证)通过指定包含文件的 URL 来调用 "include" 的代码,例如

HTTPS://example.com/include/user_admin.inc.php

解决问题的正确方法是尽量减少包含文件中的内联代码,在 类 或函数中声明所需的功能,包含后在调用代码中显式调用该功能。请注意,您可以 return 包含时执行的内联代码中的值,因此无需实现所包含功能的每一位细节即可解决问题的一种方法是:

  $fn=include Config::template_dir."/tpl.{$name}.php";
  $fn($var);

我已经用变长参数列表解决了这个问题

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