PHP在函数中访问全局变量

时间:2013-03-28 16:36:54

标签: php scope

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

<?php
$data = 'My data';

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

menugen();
?>

输出中有[]

9 个答案:

答案 0 :(得分:128)

它不起作用,因为您 声明您将要访问的全局变量:

$data = 'My data';

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

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

menugen();

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

即使有点OT,我建议你完全避免使用全局变量而更喜欢传递参数。

答案 1 :(得分:14)

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

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

或者

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

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

答案 2 :(得分:7)

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

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

$data = 'My data';

function menugen($data)
{
    echo $data;
}

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

class MyClass
{
    private $data = "";

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

}

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

答案 3 :(得分:5)

另一种方法:

<?php

$data = 'My data';

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

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

$menugen();

答案 4 :(得分:2)

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

<?php
    $data = "Hello";

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

    sayHello();
?>

我发现它简单易懂。 $ GLOBAL是PHP允许您引用全局变量的方式。如果您曾经使用过$ _SERVER,$ _ POST等功能,那么您将引用一个全局变量而不知道它。

答案 5 :(得分:0)

您需要将变量传递给函数:

$data = 'My data';

function menugen($data)
{
    echo $data;
}

答案 6 :(得分:0)

如果您愿意,可以使用&#34;定义&#34;函数但这个函数创建一个常量,一旦定义就不能改变。

<?php
define("GREETING", "Welcome to W3Schools.com!");

function myTest() {
    echo GREETING;
}

myTest();
?>

http://www.w3schools.com/php/php_constants.asp

答案 7 :(得分:0)

<?php

    $data = 'My data';

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

        echo "[ $data ]";
    };

    $menugen();
?>

您还可以简化

echo "[" . $data . "]"

echo "[$data]"

答案 8 :(得分:0)

由于这个原因,PHP可能令人沮丧。上面使用global的答案对我不起作用,我花了一段时间才弄清楚use的正确用法。

这是正确的:

$functionName = function($stuff) use ($globalVar) {
 //do stuff
}
$output = $functionName($stuff);
$otherOutput = $functionName($otherStuff);

这是不正确的:

function functionName($stuff) use ($globalVar) {
 //do stuff
}
$output = functionName($stuff);
$otherOutput = functionName($otherStuff);

使用您的特定示例:

    $data = 'My data';

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

    $menugen();