根据大多数编程语言范围规则,我可以访问在其中的函数之外定义的变量,但为什么这段代码不起作用?
<?php
$data = 'My data';
function menugen(){
echo "[".$data."]";
}
menugen();
?>
输出中有[]
。
答案 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();
?>
答案 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();