【问题标题】:Passing a variable from one php include file to another: global vs. not将变量从一个 php 包含文件传递到另一个:全局与非
【发布时间】:2011-06-08 05:41:01
【问题描述】:

我正在尝试将变量从一个包含文件传递到另一个。除非我在第二个包含文件中将变量声明为全局变量,否则这不起作用。但是,我不需要在调用第一个包含的文件中将其声明为全局。例如:


front.inc:

$name = 'james';

index.php:

include('front.inc');
echo $name;
include('end.inc');

输出:詹姆斯


end.inc:

echo $name;

输出:没有


如果我在 end.inc 中回显 $name 之前声明了全局 $name,那么它可以正常工作。这篇文章接受的答案解释说,这取决于您的服务器配置:Passing variables in PHP from one file to another

我正在使用 Apache 服务器。我将如何配置它以便不需要将 $name 声明为全局?一种与另一种相比有优势/劣势吗?

【问题讨论】:

  • includes 不像函数。包括不破坏变量范围。就好像您将包含文件的内容直接复制粘贴到调用脚本中一样。
  • end.inc 中的回声是否在函数内?
  • 这会破坏变量范围。在这种情况下,您可能应该在参数中将 $name 传递给函数。
  • 应该按规定工作!
  • end.inc 中的回声不在函数内部。假设我上面描述的三个文件包含的内容与我所写的内容差不多。

标签: php variables include scope global


【解决方案1】:

一切都与范围有关。似乎在 PHP 中,在全局范围内定义的变量不会在函数范围内自动继承。这就是为什么在函数体中,您必须在变量前面加上 global 关键字。

来自 PHP 手册:

使用 global 语句在函数范围内导入的真正全局变量实际上会创建对全局变量的引用。

因此变量 $name 可用于两个包括(front.incend.inc),但在这些文件中定义的任何函数都无法访问变量 $name,除非使用了 global 关键字或 @ 987654329@常量。

我从https://www.php.net/manual/en/language.variables.scope.php 获取了一些代码来更好地理解这个问题:

<?php
$a = 1; /* global scope */ 

function test()
{
    /* the code below will throw a Warning: Undefined variable $a ... */
    echo $a; /* reference to local scope variable */
} 

要获取变量值,您必须像这样调用 global $a:

<?php
$a = 2; /* global scope */

function test2() {
    global $a;
    /* now we have access to the global $a so no more warnings */
    echo $a;
}

您还可以依靠$GLOBALS 来访问全局,如下所示:

<?php
$a = 3; /* global scope */

function test3() {
    echo $GLOBALS['a'];
}

您可以使用如下代码获取所有全局变量的列表:

echo "<pre>";
print_r($GLOBALS);
echo "</pre>";

以上代码来源:Is it possible to List Out All the Global variables in PHP?

【讨论】:

    【解决方案2】:

    父文件可以访问两个包含文件中的变量

    在 PHP 中包含文件时,它就像代码存在于包含它们的文件中一样。想象一下,将每个包含文件中的代码直接复制并粘贴到您的index.php 中。这就是 PHP 使用包含的方式。

    因此,在您的示例中,由于您在 front.inc 文件中设置了一个名为 $name 的变量,然后在您的 index.php 中包含了 front.incend.inc,您将能够 @ 987654328@ 变量$name 在您的index.phpfront.incinclude 之后的任何位置。同样,PHP 处理您的index.php,就好像您包含的两个文件中的代码是该文件的部分

    包含的文件无权访问其他包含的文件

    当您将 echo 放在包含文件中时,将其放置在本身未定义的变量中时,您将不会得到结果,因为它与任何其他包含文件分开处理。

    换句话说,要执行您期望的行为,您需要将其定义为全局。

    【讨论】:

    • 您的回答似乎自相矛盾。你说过几次包含一个文件就像所有代码只是一个文件的一部分一样。因此,我在帖子中描述的内容相当于: $name = 'james';回声$名称;回声$名称; ——那应该产生詹姆斯詹姆斯。但是你的倒数第二段与我刚才描述的相矛盾。也许您的意思是只有进行包含调用的文件才能访问包含文件的变量,因此其他包含文件无权访问这些变量。对吗?
    • 是的,这听起来很正确。对不起,如果我说的话令人困惑。我编辑了 5 次,因为我很难描述这个过程而不会让你迷失。因此,父文件可以访问两个包含文件中的变量,但包含文件无权访问另一个包含文件。如果这有任何意义。
    • 投了反对票,因为前两段与以下句子明显矛盾。
    • 已更改为@GlebKemarsky 的赞成票
    【解决方案3】:

    这里与 php 5.4.7 相同

    $mysql = false;
    include("inc_mysql.php");
    echo($mysql);
    

    其中inc_mysql.php:

    $mysql = true;
    

    回显 $mysql = false;

    但是

    如果删除第一个 $mysql=false;

    include("inc_mysql.php");
    echo($mysql);
    

    回显 $mysql = true;

    因此,至少在某些 PHP 版本中,执行包含不像复制/粘贴代码。

    【讨论】:

      【解决方案4】:

      这就是你所要做的:

      在前面.inc

      global $name;
      $name = 'james';
      

      【讨论】:

      • 添加一些解释,说明此答案如何帮助 OP 解决当前问题
      • 我遇到了与 maxedison 描述的相同的问题。我也对许多答案感到困惑:“php 进程包括像你复制和粘贴一样......”这是不正确的,感谢迈克尔在他的回答下的解释,我知道包含文件中的代码无法识别先前包含文件中定义的全局变量.在我的实验中,我还遇到了如果我在第一个 iclude 中使用“全局”关键字可以纠正这个问题——就像保罗回答的那样。但是我在哪里可以找到 PHP 文档中描述的这两种情况?第二个问题是,如果两者都不是仅来自某些 PHP 版本?
      【解决方案5】:

      这是一个需要避免的陷阱。如果您需要在函数中访问变量 $name,您需要说“global $name;”在该功能的开头。您需要对同一文件中的每个函数重复此操作。

      include('front.inc');
      global $name;
      
      function foo() {
        echo $name;
      }
      
      function bar() {
        echo $name;
      }
      
      foo();
      bar();
      

      只会显示错误。正确的做法是:

      include('front.inc');
      
      function foo() {
        global $name;
        echo $name;
      }
      
      function bar() {
        global $name;
        echo $name;
      }
      
      foo();
      bar();
      

      【讨论】:

      • 换句话说:写global $var,然后在另一个函数中使用它。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-14
      • 2023-03-17
      • 1970-01-01
      相关资源
      最近更新 更多