【问题标题】:PHP passing variables via include files (relative path vs absolute path)PHP通过包含文件传递变量(相对路径与绝对路径)
【发布时间】:2012-06-19 06:15:54
【问题描述】:

我想将包含文件identity.php 中定义的变量传递给父文件,我将其称为parent.php。当我通过它的相对路径包含 identity.php 时,该变量可用于 parent.php 文件。当我通过它的绝对路径(到应用程序根目录)包含 identity.php 时,它不起作用。这是为什么呢?

文件:identity.php

$g_groupid = 2;

文件:parent.php

include('absolute_path_to_identity.php');
echo $g_groupid; //NOTHING!

但是...
文件:parent.php

include('../../identity.php'); //relative path to include file 
echo $g_groupid; //echos 2 as expected

我已经通过回显“身份文件包含消息”(来自 identity.php 文件)验证了identity.php 在两种情况下都包含,该消息是显示相对和绝对包括。这种行为的原因可能是什么?

【问题讨论】:

  • 启用完整的错误报告。您使用的绝对路径很可能是错误的。
  • 我已经回显了绝对路径,它是正确的。我还在包含文件中包含了一个 echo 语句,并且在两种情况下都会回显该消息 - 表明该文件已包含在两个实例中。
  • 文件肯定不包括在内。您应该使用require 而不是include 来确认
  • @ShaktiSingh 文件包括在内。我在使用 require 时遇到了同样的问题。我将继续使用相对包含 - 因为它有效! - 但知道为什么它在后一种情况下不起作用会很有用。
  • Globals are bad。设计应该在函数和类中更改为encapsulate the code,使这个问题没有意义。

标签: php variables include scope filepath


【解决方案1】:

您是否尝试过使用 realpath()

require_once(realpath('../../identity.php'));

另外,如果错误报告尚未打开,我建议关闭它,这样您就可以确保文件确实包含在内,并获得更多信息。将此添加到文件顶部:

ini_set("display_errors","On");
error_reporting(E_ALL);

【讨论】:

    【解决方案2】:

    这听起来像您的“绝对路径”是一个类似http://www.example.com/folder/identity.php 的 URL 如果是这种情况,PHP 将使用 HTTP 从 Web 服务器获取代码,因此所有 PHP 代码将在 文件被包含之前进行评估。

    这也会给出您在echo 故障排除中描述的行为。

    “绝对路径”的形式为 /home/user/public_html/folder/identity.php,与 URL 不同。


    考虑一下:

    identity.php

    <?php
    echo 'Is included';
    $g_groupid = 2;
    ?>
    

    当由 PHP 解释器评估时,这将产生以下原始文本:

    Is included
    

    如果您将 原始文本 包含到 parent.php 中,它的行为就像是没有任何 PHP 代码的原始 HTML,因为其中没有 &lt;?php 标记原始文本。然后考虑这个identity.php

    <?php
    echo 'Is included <?php $g_groupid = 3; ?>';
    $g_groupid = 2;
    ?>
    

    这将导致:

    Is included <?php $g_groupid = 3; ?>
    

    您现在在 parent.php 中得到什么结果? $g_groupid 是2 还是3

    【讨论】:

    • 使用绝对路径包含文件与将其包含为原始文本不同。您不是“阅读”文件,而是包含它(意味着它由 php 处理),所以它无关紧要。
    • 您是否尝试像我在上面的答案中写的那样添加错误报告?
    【解决方案3】:

    您确定您的绝对路径有效吗?

    我有类似的问题,在这种情况下,我总是使用通过 DOCUMENT_ROOT 的完整路径

    include($_SERVER['DOCUMENT_ROOT']."/your_file_path.php");
    

    【讨论】:

      【解决方案4】:

      嗯,试试吧:

      include('absolute_path_to_identity.php');
      global $g_groupid;
      echo $g_groupid;
      

      【讨论】:

      • 我认为只有在我们想从函数中访问变量时才需要全局变量,不是吗?
      • 是的,我知道。但这是一个不常见的错误,我认为它有帮助。我错了
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-19
      • 2012-01-11
      相关资源
      最近更新 更多