PHP在函数中访问全局变量

Ami*_*ian 73 php scope

根据大多数编程语言范围规则,我可以访问在其中的函数外部定义的变量,但为什么这段代码不起作用?

<?php
$data = 'My data';

function menugen(){   
    echo "[".$data."]";
}

menugen();
?>
Run Code Online (Sandbox Code Playgroud)

[]输出.

Mat*_*ari 142

它无法正常工作,因为您必须声明要访问的全局变量:

$data = 'My data';

function menugen() {
    global $data; // <-- add this line

    echo "[".$data."]";
}

menugen();
Run Code Online (Sandbox Code Playgroud)

否则你可以访问它$GLOBALS['data'],请参阅http://php.net/manual/en/language.variables.scope.php

即使有点OT,我建议你完全避免使用全局变量并且更喜欢作为参数传递.

  • 事实上第二个例子是向读者展示**不要做什么:`这个脚本不会产生任何输出,因为echo语句引用了$ a变量的本地版本,并且它没有被分配这个范围内的价值 (5认同)
  • 当!我必须登录才能对这个答案进行投票,因为我令人毛骨悚然地忘记了 php 变量范围。 (2认同)

jcb*_*lkr 18

您可以执行以下操作之一:

<?php
$data='My data';
function menugen(){
    global $data;
    echo "[".$data."]";
}
menugen();
Run Code Online (Sandbox Code Playgroud)

要么

<?php
$data='My data';
function menugen(){
    echo "[".$GLOBALS['data']."]";
}
menugen();
Run Code Online (Sandbox Code Playgroud)

话虽这么说,过度使用全局变量可能导致一些糟糕的代码.传递你需要的东西通常更好.例如,您应该将句柄传递给数据库并对其进行操作,而不是引用全局数据库对象.这称为依赖注入.当您实施自动化测试时,它会让您的生活变得更加轻松(您应该这样做).


web*_*oob 11

这是一个范围问题.简而言之,应该避免使用全局变量:

您需要将其作为参数传递:

$data = 'My data';

function menugen($data)
{
    echo $data;
}
Run Code Online (Sandbox Code Playgroud)

或者将它放在一个类中并访问它

class MyClass
{
    private $data = "";

    function menugen()
    {
        echo this->data;
    }

}
Run Code Online (Sandbox Code Playgroud)

编辑:请参阅@MatteoTassinari答案以及您可以将其标记为全局访问它,但通常不需要全局变量,因此重新考虑您的编码是明智的.

  • @Beejor - 这个论点的问题是人们可能“认为”他们需要一个全局变量,因为他们不知道更好,除非被告知,否则他们不会知道更好。 (3认同)
  • “应该”并不能回答问题,而且这可能不是适合每种情况的最佳方法。对于简单的脚本,更改参数和添加类很笨重。就像 JavaScript 一样,在 PHP 中,并不是所有东西都需要面向对象并在 wazoo 中命名。 (2认同)

小智 8

另一种方法是:

<?php

$data = 'My data';

$menugen = function() use ($data) {

    echo "[".$data."]";
};

$menugen();
Run Code Online (Sandbox Code Playgroud)


Psa*_*alu 5

多年来我一直使用这种格式:

<?php
    $data = "Hello";

    function sayHello(){
        echo $GLOBALS["data"];
    }

    sayHello();
?>
Run Code Online (Sandbox Code Playgroud)

我发现它简单易懂。$GLOBALS 是 PHP 允许您引用全局变量的方式。如果您使用过 $_SERVER、$_POST 等内容,那么您就在不知情的情况下引用了全局变量。