【问题标题】:Passing PHP variables to an included file?将 PHP 变量传递给包含的文件?
【发布时间】:2010-12-08 18:01:23
【问题描述】:

这应该可以工作,所以我真的很困惑为什么它不工作。

我正在检查用户是否使用每个管理页面顶部的 $session 类方法登录。但是,我想根据用户是否登录以及该用户的角色级别来动态调整头文件。

所以我检查了$session->is_logged_in(),然后我继续定义了一个名为$logged = true的变量;以后使用。然后我使用$user->find_by_id($session->id) 方法创建一个新的用户对象并将$user->role_level 存储在一个名为$role_level 的新变量中以方便使用。

这一切都发生在页面顶部附近。在表单处理等页面的下方是include("../_layouts/header.php") 命令。然后,在 header.php 文件中,我使用了像if(!$logged) { ... } else { ... } 这样的小检查。不过……

我收到以下错误:

Notice: Undefined variable: logged in /home/hips/html/_layouts/header.php on line 119
Notice: Undefined variable: logged in /home/hips/html/_layouts/header.php on line 131
Notice: Undefined variable: logged in /home/hips/html/_layouts/header.php on line 138

这怎么可能?在包含 header.php 之前,我在文件中定义了变量!那不应该工作吗?

仅供参考,在我尝试在 header.php 文件中使用 $logged 之前一切正常。

【问题讨论】:

  • $logged 在每种情况下都设置了吗?代码中没有可能设置失败的方法吗?如果在脚本顶部(定义之前)添加$logged = "";,会发生什么?
  • 有一次我在函数中包含了一个文件。除非您将变量作为参数传递或使用 global 定义它们,否则它们在包含的文件中不可用。只是一个花絮。

标签: php variables include


【解决方案1】:

变量确实会传播到包含的文件,因此必须在调用包含时未设置变量:尝试检查是否如此,然后找出为什么此时未设置变量。

例如,如果您在“if”块或函数内部定义了 $logged,那么它不会传播到外部:您必须在最外层范围内定义它(在您调用包括声明)。而且你必须为用户未登录的情况定义它,而不仅仅是用户登录的情况。如果变量未初始化为false,则检查if(!$ logged)将发出警告。说 $logged = false;在你工作的开始。

【讨论】:

  • 谢谢你们俩。 $logged 变量在文件顶部设置为 $logged = false; -- 很混乱。
  • 它一定是某种故障,因为它现在正在工作。谢谢大家。
【解决方案2】:

尝试一些非常简单的事情,比如

// file1.php
$var = "foobar";

// file2.php
include("file1.php"); // or require("file1.php");
die($var);

有效吗?也许这是您的代码之外的问题。

【讨论】:

    【解决方案3】:

    只是一个意见...而不是包含要在全局空间中执行的代码并取决于另一个正在定义的全局变量,而是将您的文件包含在任何地方,并将 header.php 中的代码组织成适当的函数。然后,在您想要 header.php 的输出的地方,使用 $logged 作为参数调用适当的函数。这将有助于使您的代码更具凝聚力并且更易于测试(就像在单元测试中一样)。

    【讨论】:

    • 我不确定我是否听懂了,但我对你所说的很感兴趣。我将用户数据存储在会话中,因此我只需要能够根据用户的角色/权限更改标题 HTML。当 header.php 似乎无法调用 $session 变量时,我尝试声明 $logged。看起来有一个小故障阻止了我做任何一个,所以我现在可能可以回到只是调用 $session-> 等。你的建议是什么?
    • 它与您可能遇到的任何问题无关,但与在其中包含全局代码的文件的常见做法更相关(意味着代码不在任何函数内)和包括您希望其输出出现在页面中的那个文件。相反,我的建议是将代码包装在一个函数中。而不是该文件中的代码使用预期在包含页面中定义的变量,而是稍微重写它,以便代码使用函数的参数。然后你可以在页面顶部(或任何地方)包含该文件并调用它。
    • ...所以你可能有function getPageHeader($bIsLoggedIn) { do stuff based on $bIsLoggedIn and return the HTML as a string; }。您希望输出出现的位置可以echo getPageHeader($logged);。这将使代码与全局变量等分离,并使其可重用和单元测试。它更安全,更不容易被破坏。
    【解决方案4】:

    试试if (empty($logged)),而不是if (!logged)。在未设置变量的情况下,这不会生成通知。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-05-20
      • 1970-01-01
      • 1970-01-01
      • 2016-06-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多