根据大多数编程语言范围规则,我可以访问在其中的函数外部定义的变量,但为什么这段代码不起作用?
<?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,我建议你完全避免使用全局变量并且更喜欢作为参数传递.
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答案以及您可以将其标记为全局访问它,但通常不需要全局变量,因此重新考虑您的编码是明智的.
小智 8
另一种方法是:
<?php
$data = 'My data';
$menugen = function() use ($data) {
echo "[".$data."]";
};
$menugen();
Run Code Online (Sandbox Code Playgroud)
多年来我一直使用这种格式:
<?php
$data = "Hello";
function sayHello(){
echo $GLOBALS["data"];
}
sayHello();
?>
Run Code Online (Sandbox Code Playgroud)
我发现它简单易懂。$GLOBALS 是 PHP 允许您引用全局变量的方式。如果您使用过 $_SERVER、$_POST 等内容,那么您就在不知情的情况下引用了全局变量。