首页 > 解决方案 > 包含辅助方法 - 全局变量

问题描述

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

标签: phpinclude

解决方案


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

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

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

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

推荐阅读