为什么我不能将变量传递到PHP中的包含文件?

时间:2009-12-13 18:22:40

标签: php variables include

我在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文件的角度设置的。

为什么会这样?是否与使用函数包含而不是直接包含它有关?如果是这样,那为什么会这么重要?

4 个答案:

答案 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不会授予函数访问全局变量的权限。消除你的意见也是一个好主意。