按照大多数编程语言范围的规则,我可以访问内部它们的函数之外定义的变量,但是为什么这个代码不工作?
<?php
$data = 'My data';
function menugen(){
echo "[".$data."]";
}
menugen();
?>
有[]
中输出。
按照大多数编程语言范围的规则,我可以访问内部它们的函数之外定义的变量,但是为什么这个代码不工作?
<?php
$data = 'My data';
function menugen(){
echo "[".$data."]";
}
menugen();
?>
有[]
中输出。
这是行不通的,因为你必须声明其全局变量,你就可以访问:
$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,我建议你避免全部采用全局,宁愿传递作为参数。
您可以执行下列操作之一:
<?php
$data='My data';
function menugen(){
global $data;
echo "[".$data."]";
}
menugen();
要么
<?php
$data='My data';
function menugen(){
echo "[".$GLOBALS['data']."]";
}
menugen();
话虽这么说,全局的过度使用可能会导致一些贫困的代码。 它通常是更好的,你需要的东西通过。 例如,而不是引用全局数据库对象,你应该传递一个句柄到数据库,并在该行动。 这就是所谓的依赖注入。 它使你的生活,当你实现自动化测试容易得多(你应该)。
它的范围的问题。 总之,全局变量应该是这样避免:
你要么需要把它作为参数传递:
$data = 'My data';
function menugen($data)
{
echo $data;
}
或者它在一个类和访问
class MyClass
{
private $data = "";
function menugen()
{
echo this->data;
}
}
编辑:见@MatteoTassinari回答,以及你可以将其标记为全球访问,但全局变量则一般不需所以这将是明智的重新思考你的编码。
另一种方式来做到这一点:
<?php
$data = 'My data';
$menugen = function() use ($data) {
echo "[".$data."]";
};
$menugen();
您需要将变量传递到函数:
$data = 'My data';
function menugen($data)
{
echo $data;
}
如果你愿意,你可以使用“定义”功能,但该功能创建不能更换一次定义的常量。
<?php
define("GREETING", "Welcome to W3Schools.com!");
function myTest() {
echo GREETING;
}
myTest();
?>
http://www.w3schools.com/php/php_constants.asp