PHP5.3:这个变量究竟是如何定义的?
今天我在玩弄一些PHP,做我通常在尝试一种我不懂或生疏的语言时做的事情:写一个小的烂纸牌游戏 第一项任务是用所有可用的牌推出一个分类牌组。以下是我的(失败的)尝试:PHP5.3:这个变量究竟是如何定义的?,php,variables,undefined,php-5.3,Php,Variables,Undefined,Php 5.3,今天我在玩弄一些PHP,做我通常在尝试一种我不懂或生疏的语言时做的事情:写一个小的烂纸牌游戏 第一项任务是用所有可用的牌推出一个分类牌组。以下是我的(失败的)尝试: 我不确定这个代码在逻辑上是否正确;我匆忙地写了它。但即使我真的想检查它,我也不能,因为它会失败,并显示以下消息:“Undefined variable:suit” 只有一个地方可以使用$suit,那就是$card函数。假设$card函数是在以$suit为参数的匿名函数中分配的,那么它肯定是可以访问的,对吗?此外,必须定义它,因为
我不确定这个代码在逻辑上是否正确;我匆忙地写了它。但即使我真的想检查它,我也不能,因为它会失败,并显示以下消息:“Undefined variable:suit”
只有一个地方可以使用$suit,那就是$card函数。假设$card函数是在以$suit为参数的匿名函数中分配的,那么它肯定是可以访问的,对吗?此外,必须定义它,因为PHP自己的array_map函数是从我定义的值数组中提供参数的函数
我将函数卡($rank){…
转换为$card=function($rank){…
,认为前者可能使其像Perl的sub一样是全局的,从而使内部变量无法访问。但令我惊讶的是,后者也不起作用
有人能给我一个正确的方向吗?您需要使用
use
关键字为内部闭包捕获$suit
变量,因为该变量只存在于外部函数($suit)
闭包(作为其参数)的范围内,而不存在于内部函数($rank)
闭包:
function($suit) {
$card = function($rank) use($suit) {
return array(
'suit' => $suit
, 'rank' => $rank
);
};
return
array_map($card, range(2, 10))
+ array_map($card, array('jack', 'queen', 'king', 'ace'))
;
}
在第一个匿名函数中定义$suit。因此它在本地范围内。要在嵌套匿名函数中使用它,必须通过参数传递它(或使用global关键字将其全球化)谢谢,这正是我想要的。显式捕获…很有趣。C++11也有这个功能,但至少它有“捕获全部”和“通过引用捕获全部”选项。PHP有什么等效的功能吗?只是出于兴趣,有什么特殊的原因PHP不能为我自动捕获变量吗?@Louis,我忘了原因,但是,当他们在讨论添加闭包时,php内部列表中有几个后台兼容性问题。没有让它自动更改作用域语义解决了很多问题。不,只需使用
use
@BoltClock从外部作用域捕获它。是的,这是一个更好的解决方案。我对你的Answare进行了投票
function($suit) {
$card = function($rank) use($suit) {
return array(
'suit' => $suit
, 'rank' => $rank
);
};
return
array_map($card, range(2, 10))
+ array_map($card, array('jack', 'queen', 'king', 'ace'))
;
}