Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP5.3:这个变量究竟是如何定义的?_Php_Variables_Undefined_Php 5.3 - Fatal编程技术网

PHP5.3:这个变量究竟是如何定义的?

PHP5.3:这个变量究竟是如何定义的?,php,variables,undefined,php-5.3,Php,Variables,Undefined,Php 5.3,今天我在玩弄一些PHP,做我通常在尝试一种我不懂或生疏的语言时做的事情:写一个小的烂纸牌游戏 第一项任务是用所有可用的牌推出一个分类牌组。以下是我的(失败的)尝试: 我不确定这个代码在逻辑上是否正确;我匆忙地写了它。但即使我真的想检查它,我也不能,因为它会失败,并显示以下消息:“Undefined variable:suit” 只有一个地方可以使用$suit,那就是$card函数。假设$card函数是在以$suit为参数的匿名函数中分配的,那么它肯定是可以访问的,对吗?此外,必须定义它,因为

今天我在玩弄一些PHP,做我通常在尝试一种我不懂或生疏的语言时做的事情:写一个小的烂纸牌游戏

第一项任务是用所有可用的牌推出一个分类牌组。以下是我的(失败的)尝试:


我不确定这个代码在逻辑上是否正确;我匆忙地写了它。但即使我真的想检查它,我也不能,因为它会失败,并显示以下消息:“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'))
        ;
}