访问php函数中的全局变量

6ss1mwsb  于 2021-07-29  发布在  Java
关注(0)|答案(9)|浏览(266)

根据大多数编程语言的作用域规则,我可以访问在它们内部的函数之外定义的变量,但是为什么这段代码不能工作呢?

<?php
    $data = 'My data';

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

    menugen();
?>

输出为 [] .

xwbd5t1u

xwbd5t1u1#

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

$data = 'My data';

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

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

menugen();

否则您可以作为 $GLOBALS['data'] . 请参见变量范围。
即使有点离题,我还是建议您完全避免使用globals,而更喜欢作为参数传递。

blmhpbnm

blmhpbnm2#

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

<?php
    $data = 'My data';

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

    menugen();

<?php
    $data = 'My data';

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

    menugen();

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

cyvaqqii

cyvaqqii3#

这是个范围问题。简言之,应避免使用全局变量,以便:
您需要将其作为参数传递:

$data = 'My data';

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

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

class MyClass
{
    private $data = "";

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

}

也可以查看@matteotassinari answer,因为您可以将其标记为全局来访问它,但是通常不需要全局变量,因此重新考虑您的编码是明智的。

hc2pp10m

hc2pp10m4#

另一种方法是:

<?php

$data = 'My data';

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

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

$menugen();

更新2020-01-13:peter mortensen要求
从PHP5.3.0开始,我们有匿名函数支持,可以创建闭包。闭包可以访问在其作用域之外创建的变量。
在本例中,闭包能够访问 $data 因为它是在 use 条款。

7ajki6be

7ajki6be5#

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

<?php
    $data = "Hello";

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

    sayHello();
?>

我觉得它简单明了。$globals是php允许您引用全局变量的方式。如果您使用过像$\u server、$\u post等东西,那么您就可以在不知道的情况下引用全局变量。

ijxebb2r

ijxebb2r6#

您需要将变量传递到函数中:

$data = 'My data';

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

laawzig27#

<?php

    $data = 'My data';

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

        echo "[ $data ]";
    };

    $menugen();
?>

你也可以简化

echo "[" . $data . "]"

echo "[$data]"
dpiehjr4

dpiehjr48#

由于这个原因,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();
0kjbasz6

0kjbasz69#

如果需要,可以使用“define”函数,但该函数创建一个常量,一旦定义就不能更改。

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

    function myTest() {
        echo GREETING;
    }

    myTest();
?>

php常量

相关问题