访问PHP函数中的全局变量

访问PHP函数中的全局变量,php,scope,Php,Scope,根据大多数编程语言的作用域规则,我可以访问在它们内部的函数之外定义的变量,但是为什么这段代码不起作用呢 <?php $data = 'My data'; function menugen() { echo "[" . $data . "]"; } menugen(); ?> 输出为[]您需要将变量传递到函数中: $data = 'My data'; function menugen($data) { echo $da

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

<?php
    $data = 'My data';

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

    menugen();
?>


输出为
[]

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

$data = 'My data';

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

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

$data = 'My data';

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

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

menugen();
$data='My data';
函数menugen(){

global$data;//这是一个范围问题。简言之,应避免使用全局变量,以便:

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

$data = 'My data';

function menugen($data)
{
    echo $data;
}
或者将它放在类中并访问它

class MyClass
{
    private $data = "";

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

}

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

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

<?php
    $data = 'My data';

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

    menugen();
另一种方法:


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

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

    function myTest() {
        echo GREETING;
    }

    myTest();
?>


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


我发现它简单易懂。$GLOBALS是PHP允许您引用全局变量的方式。如果您使用了$\u SERVER、$\u POST等,那么您可以在不知道的情况下引用全局变量。


你也可以简化

echo "[" . $data . "]"


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


不要将其视为全局变量,将其作为参数传递给函数。手册在哪里说明了这些内容?相关阅读:检查本页的第二个示例:如果我们可以使用$GLOBALS['varname']访问,其中索引“varname”在函数外部是$varname。实际上,我们可以使用print\r($GLOBALS)查看所有全局变量。另一种方法是使用关键字global(当然,这不是最好的方法)。“应该”没有回答这个问题,而且这可能不是每种情况下的最佳方法。对于简单的脚本,更改参数和添加类都很麻烦。与JavaScript非常相似,在PHP中,并非所有内容都需要面向对象并在wazoo上命名。@Beejor,因为OP有一个名为
menugen()的函数
这意味着将不仅仅是生成菜单。例如,如何扩展该菜单以添加来自不同来源的更多项目,如何选择菜单中当前选定的页面。到处都是随机的全局变量和逻辑,这就要求进行OOP设计。事实上,PHP/JS没有这样做“需要结构化是你发现大量凌乱笨拙的代码的最大原因之一。它可以做得很好,但让人们不考虑将来的可维护性。p.s.否决投票的答案也有点不恰当。这个答案确实为OP的问题提供了解决方案,只是因为你不喜欢它,不会让它出错。@Beejor”-这个论点的问题是,人们可能认为他们需要一个全局变量,因为他们不知道更好的,也不会知道更好的,除非他们被告知。谢谢,你是对的,但他们在手册的第二个示例中没有使用这一行:事实上,第二个示例是为了告诉读者什么不可以做:
这个脚本将不会产生任何输出,因为echo语句引用了$a变量的本地版本,并且未在此范围内为其分配值。
Dang!我不得不登录以更新此答案,因为我突然忘记了php变量的作用域。这定义了一个全局常量,而不是变量。常量一旦定义就不能更改。Thi在我的例子中,s是唯一有效的解决方案,我在另一个函数中定义了一个函数作为变量。Global在那里不起作用。应该进行解释。例如,这个“使用”的东西做什么?这个“使用”的东西在哪些PHP版本中受支持?(请回复,而不是在评论中(视情况而定)。提前感谢。)不知道为什么已批准的ans在Wordpress管理插件页面中没有显示任何输出,但此ans运行良好。哪一个?
$GLOBAL
(文本)或
$GLOBALS
(示例代码)?(请回复,而不是在评论中(视情况而定)。)它是$GLOBALS而不是$GLOBAL。应该有一个“s”。然后引用变量名称,就像引用关联数组的键一样。请(要开始,请单击“”,在“共享”和“标志”之间。这三个位于左侧-在“已编辑”和“已回答”的左侧,在回答本身之后,在注释上方,以及在所有三个注释上方)。评论中的信息随时可能消失。这不是一个论坛-信息可以(也应该)在这里更新。确实提前感谢您。
echo“[”$data.]”“
echo”[$data]”
不一样(在输出中为后者增加两个空格)。
function functionName($stuff) use ($globalVar) {
 //do stuff
}
$output = functionName($stuff);
$otherOutput = functionName($otherStuff);
    $data = 'My data';

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

    $menugen();