我在before之前遇到了这个问题而没有真正的解决方法。它再次发生,所以我希望你的专家可以提供帮助。
我根据$ _GET数组在index.php上设置了一个变量。所以我使用这段代码:
$admin = isset($_GET['admin']) ? $_GET['admin'] : "dashboard";
在下面,我使用一个函数来包含我的布局:
include_layout("admin_header.php");
调用此函数:
function include_layout($template="") {
include(SITE_ROOT.DS.'layouts'.DS.$template);
}
到目前为止,这么好,一切正常。但是,如果我尝试从admin_header.php文件中回显$ admin变量,我什么也得不到。就好像它没有设置一样。我甚至在包含头文件之前使用echo $admin;
测试它,然后输出,但是它不是从admin_header.php文件的角度设置的。
为什么会这样?是否与使用函数包含而不是直接包含它有关?如果是这样,那为什么会这么重要?
答案 0 :(得分:12)
因为你使用函数包含文件,因此该变量超出了范围。您需要将变量传递给另一个参数中的函数,或者在函数中将变量声明为global
或者:
function include_layout($template="") {
global $admin;
include(SITE_ROOT.DS.'layouts'.DS.$template);
}
或:
function include_layout($template="",$admin="") {
include(SITE_ROOT.DS.'layouts'.DS.$template);
}
include_layout("admin_header.php",$admin);
答案 1 :(得分:9)
除非您明确说明,否则无法访问全局变量。您必须在函数中放置global $admin
才能访问变量。
原因是您将文件包含在函数内部,因此$ admin变量位于全局范围内,而包含的文件位于函数范围内。
function include_layout($template="") {
global $admin;
include(SITE_ROOT.DS.'layouts'.DS.$template);
}
另一种可能性是使用提取方法。
function include_layout($template="", $variables) {
extract($variables, EXTR_SKIP);
include(SITE_ROOT.DS.'layouts'.DS.$template);
}
include_layout("test.php", array('admin' => $admin));
答案 2 :(得分:4)
这是一个变量范围问题。 $ admin没有在函数include_layout()中定义。您可以通过几种方式调整代码。一个是说“全球$ admin;”在include_layout()里面。另一个是在“admin_header.php”中设置变量$ admin,例如,如果只在该一个布局上下文中需要该变量。
答案 3 :(得分:3)
它可能很重要,因为除非您明确要求,否则PHP不会授予函数访问全局变量的权限。消除你的意见也是一个好主意。