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(); ?>