在学习PHP中的匿名函数时,我遇到了这个问题:
匿名函数可以使用其封闭中定义的变量 范围使用使用语法。
例如:
$test = array("hello", "there", "what's up");
$useRandom = "random";
$result = usort($test, function($a, $b) use ($useRandom){
if($useRandom=="random")
return rand(0,2) - 1;
else
return strlen($a) - strlen($b);
}
);
为什么我不能像下面那样只使用$ useRandom 全球?
$test2 = array("hello", "there", "what's up");
$useRandom = "random";
$result = usort($test, function($a, $b){
global $useRandom;
if($useRandom=="random")
return rand(0,2) - 1;
else
return strlen($a) - strlen($b);
}
);
这两种方法有什么区别?
答案 0 :(得分:4)
您的示例有点简化。为了获得差异,尝试将示例代码包装到另一个函数中,从而围绕内部回调创建一个额外的范围,这不是全局的。
在以下示例中,$useRandom
在排序回调中始终为null
,因为没有名为$useRandom
的全局变量。您需要使用use
来访问非全局范围的外部作用域中的变量。
function test()
{
$test = array( "hello", "there", "what's up" );
$useRandom = "random";
$result = usort( $test, function ( $a, $b ) {
global $useRandom;
// isset( $useRandom ) == false
if( $useRandom == "random" ) {
return rand( 0, 2 ) - 1;
}
else {
return strlen( $a ) - strlen( $b );
}
}
);
}
test();
另一方面,如果存在全局变量$useRandom
,则可以使用use
仅访问一个范围。在下一个示例中,$useRandom
再次为null
,因为它定义了两个范围“更高”,而use
关键字仅直接从当前范围之外的范围导入变量。
$useRandom = "random";
function test()
{
$test = array( "hello", "there", "what's up" );
$result = usort( $test, function ( $a, $b ) use ( $useRandom ) {
// isset( $useRandom ) == false
if( $useRandom == "random" ) {
return rand( 0, 2 ) - 1;
}
else {
return strlen( $a ) - strlen( $b );
}
}
);
}
test();
答案 1 :(得分:3)
出于多种原因,你必须小心全局变量,其中最重要的是出乎意料的行为:
<?php echo $this->getReviewsSummaryHtml($_product, 'default', true)?>
在这个例子中,您可能希望一旦将变量设为全局变量,它就可用于后续函数。运行此代码的结果表明此不是的情况:
我是全球性的吗?是的,我是。
全球无法使用。
以这种方式声明全局使得变量在其全局声明(在本例中为函数$foo = 'Am I a global?';
function testGlobal(){
global $foo;
echo $foo . ' Yes, I am.<br />';
}
function testAgain() {
if(isset($foo)) {
echo $foo . ' Yes, I am still global';
} else {
echo 'Global not available.<br />';
}
}
testGlobal();
testAgain();
)的范围内可用,但不在脚本的一般范围内。
在Using Globals上查看此答案以及为什么这是一个坏主意。