【问题标题】:Why can't I pass variables into an included file in PHP?为什么我不能将变量传递到 PHP 中的包含文件中?
【发布时间】:2010-12-26 05:12:27
【问题描述】:

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

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

【问题讨论】:

    标签: php variables include


    【解决方案1】:

    这是因为该变量超出范围,因为您使用函数包含文件。您要么需要在另一个参数中将变量传递给函数,要么在函数中将变量声明为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);
    

    【讨论】:

      【解决方案2】:

      除非您明确说明,否则无法访问全局变量。您必须将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));
      

      【讨论】:

      • 您可以解释为什么它不能按预期工作 - 即该文件包含在函数的上下文中。
      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        这可能很重要,因为除非您明确要求,否则 PHP 不会让函数访问全局变量。清理您的输入也是一个好主意。

        【讨论】:

        • “清理输入”是什么意思?如果您在谈论 $_GET 变量,谢谢 - 我只是想让包含工作现在。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-12-08
        • 1970-01-01
        • 2011-11-28
        • 1970-01-01
        • 1970-01-01
        • 2016-06-08
        • 1970-01-01
        相关资源
        最近更新 更多