包含辅助方法 - 全局变量
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
),因为 $var
在 Load
中不可见。如何将此解决方案与 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]);
在 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 直接放入我的代码中,因为它看起来不干净。
由于您将文件包含在函数中,因此它无法访问全局变量。您需要一个 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]);