2009-12-13 108 views
1

我在before之前有过这个问题,没有真正的解决办法。它再次发生,所以我希望你的专家能够提供帮助。为什么我无法将变量传递到PHP中的包含文件中?

我在我的index.php基于$ _GET数组设置了一个变量。所以我用这个代码:

$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文件的角度进行设置。

为什么会发生这种情况?这与使用函数来包含而不是直接包含它有关吗?如果是这样,为什么这很重要?

回答

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

你可以解释为什么它不能按预期工作 - 即该文件包含在函数的上下文中。 – gnud 2009-12-13 18:29:41

+0

就是这样。谢谢! – rhodesjason 2009-12-13 19:43:25

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

也许无关紧要,因为PHP没有按除非明确要求,否则不会给函数访问全局变量。消毒你的输入也是一个好主意。

+0

“消毒您的输入”是什么意思?如果你正在谈论$ _GET变量,谢谢 - 我只是试图让包含工作。 – rhodesjason 2009-12-13 19:42:20

4

这是一个变量范围问题。 $ admin没有在函数include_layout()中定义。您可以通过几种方式调整代码。一个是说“全球管理员”;在include_layout()中。另一种方法是在“admin_header.php”中设置变量$ admin,例如,只在该布局上下文中需要该变量。

相关问题