根据大多数编程语言的作用域规则,我可以访问在它们内部的函数之外定义的变量,但是为什么这段代码不能工作呢?
<?php $data = 'My data'; function menugen() { echo "[" . $data . "]"; } menugen(); ?>
输出为 [] .
[]
xwbd5t1u1#
它不起作用,因为您必须声明要访问的全局变量:
$data = 'My data'; function menugen() { global $data; // <-- Add this line echo "[" . $data . "]"; } menugen();
否则您可以作为 $GLOBALS['data'] . 请参见变量范围。即使有点离题,我还是建议您完全避免使用globals,而更喜欢作为参数传递。
$GLOBALS['data']
blmhpbnm2#
您可以执行以下操作之一:
<?php $data = 'My data'; function menugen() { global $data; echo "[" . $data . "]"; } menugen();
或
<?php $data = 'My data'; function menugen() { echo "[" . $GLOBALS['data'] . "]"; } menugen();
也就是说,globals的过度使用会导致一些糟糕的代码。通常你最好把需要的东西传给别人。例如,不应该引用全局数据库对象,而应该向数据库传入句柄并对其执行操作。这称为依赖注入。当您实现自动化测试(您应该这样做)时,它使您的生活变得更加轻松。
cyvaqqii3#
这是个范围问题。简言之,应避免使用全局变量,以便:您需要将其作为参数传递:
$data = 'My data'; function menugen($data) { echo $data; }
或者把它放在一个类中并访问它
class MyClass { private $data = ""; function menugen() { echo this->data; } }
也可以查看@matteotassinari answer,因为您可以将其标记为全局来访问它,但是通常不需要全局变量,因此重新考虑您的编码是明智的。
hc2pp10m4#
另一种方法是:
<?php $data = 'My data'; $menugen = function() use ($data) { echo "[".$data."]"; }; $menugen();
更新2020-01-13:peter mortensen要求从PHP5.3.0开始,我们有匿名函数支持,可以创建闭包。闭包可以访问在其作用域之外创建的变量。在本例中,闭包能够访问 $data 因为它是在 use 条款。
$data
use
7ajki6be5#
多年来,我一直使用这种格式:
<?php $data = "Hello"; function sayHello(){ echo $GLOBALS["data"]; } sayHello(); ?>
我觉得它简单明了。$globals是php允许您引用全局变量的方式。如果您使用过像$\u server、$\u post等东西,那么您就可以在不知道的情况下引用全局变量。
ijxebb2r6#
您需要将变量传递到函数中:
laawzig27#
<?php $data = 'My data'; $menugen = function() use ($data) { echo "[ $data ]"; }; $menugen(); ?>
你也可以简化
echo "[" . $data . "]"
到
echo "[$data]"
dpiehjr48#
由于这个原因,php可能会令人沮丧。以上答案使用 global 对我来说不管用,我花了一段时间才弄明白如何正确使用 use .这是正确的:
global
$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();
0kjbasz69#
如果需要,可以使用“define”函数,但该函数创建一个常量,一旦定义就不能更改。
<?php define("GREETING", "Welcome to W3Schools.com!"); function myTest() { echo GREETING; } myTest(); ?>
php常量
9条答案
按热度按时间xwbd5t1u1#
它不起作用,因为您必须声明要访问的全局变量:
否则您可以作为
$GLOBALS['data']
. 请参见变量范围。即使有点离题,我还是建议您完全避免使用globals,而更喜欢作为参数传递。
blmhpbnm2#
您可以执行以下操作之一:
或
也就是说,globals的过度使用会导致一些糟糕的代码。通常你最好把需要的东西传给别人。例如,不应该引用全局数据库对象,而应该向数据库传入句柄并对其执行操作。这称为依赖注入。当您实现自动化测试(您应该这样做)时,它使您的生活变得更加轻松。
cyvaqqii3#
这是个范围问题。简言之,应避免使用全局变量,以便:
您需要将其作为参数传递:
或者把它放在一个类中并访问它
也可以查看@matteotassinari answer,因为您可以将其标记为全局来访问它,但是通常不需要全局变量,因此重新考虑您的编码是明智的。
hc2pp10m4#
另一种方法是:
更新2020-01-13:peter mortensen要求
从PHP5.3.0开始,我们有匿名函数支持,可以创建闭包。闭包可以访问在其作用域之外创建的变量。
在本例中,闭包能够访问
$data
因为它是在use
条款。7ajki6be5#
多年来,我一直使用这种格式:
我觉得它简单明了。$globals是php允许您引用全局变量的方式。如果您使用过像$\u server、$\u post等东西,那么您就可以在不知道的情况下引用全局变量。
ijxebb2r6#
您需要将变量传递到函数中:
laawzig27#
你也可以简化
到
dpiehjr48#
由于这个原因,php可能会令人沮丧。以上答案使用
global
对我来说不管用,我花了一段时间才弄明白如何正确使用use
.这是正确的:
这是不正确的:
使用您的具体示例:
0kjbasz69#
如果需要,可以使用“define”函数,但该函数创建一个常量,一旦定义就不能更改。
php常量