PHP访问全局variables的函数

根据大多数编程语言作用域规则,我可以访问在其内部函数之外定义的variables,但为什么这个代码不起作用?

<?php $data='My data'; function menugen(){ echo "[".$data."]"; } menugen(); ?> 

输出中有[]

它不工作,因为你必须声明你将访问的全局variables:

 $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,我build议你避免使用全局variables,而宁愿传递参数。

这是一个范围的问题。 总之,应该避免全局variablesSO:

您需要将其作为parameter passing给它:

 $data = 'My data'; function menugen($data) { echo $data; } 

或者将它放在课堂上并进行访问

 class MyClass { private $data = ""; function menugen() { echo this->data; } } 

编辑:请参阅@MatteoTassinari答案以及您可以将其标记为全局访问它,但全局variables通常不是必需的,因此重新考虑您的编码是明智的。

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

 <?php $data='My data'; function menugen(){ global $data; echo "[".$data."]"; } menugen(); 

要么

 <?php $data='My data'; function menugen(){ echo "[".$GLOBALS['data']."]"; } menugen(); 

这就是说,过度使用全局variables会导致一些糟糕的代码。 传递你需要的东西通常会更好。 例如,而不是引用一个全局数据库对象,你应该把一个句柄传递给数据库,然后对其进行处理。 这就是所谓的dependency injection。 当你实现自动化testing(你应该)时,它会让你的生活变得更容易。

另一种方法来做到这一点:

 <?php $data = 'My data'; $menugen = function() use ($data) { echo "[".$data."]"; }; $menugen(); 

您需要将该variables传递给函数:

 $data = 'My data'; function menugen($data) { echo $data; } 

如果你想要,你可以使用“定义”function,但是这个function会创build一个定义不能改变的常量。

 <?php define("GREETING", "Welcome to W3Schools.com!"); function myTest() { echo GREETING; } myTest(); ?> 

http://www.w3schools.com/php/php_constants.asp