PHP 5.4数组中的匿名函数未定义

时间:2013-06-13 17:15:24

标签: php arrays variables indexing undefined

这是PHP 5.4代码......

<?php
function abc($YesNo){return $YesNo["value"];}
$YesNo = array("value"=>"No","text"=>"No");
$x = array("active"=>function(){return abc($YesNo);});
echo $x['active']();
?>

注意:未定义的变量:第7行的是否
输出应为:是

如果我通过替换$ YesNo像

直接将数组放入代码中
<?php
function abc($YesNo){return $YesNo["value"];}
$x = array("active"=>function(){return abc(array("value"=>"Yes","text"=>"Yes"));});
echo $x['active']();
?>

输出:是
这是正确的输出。现在第一个代码有什么问题。我需要它用于可重用性

4 个答案:

答案 0 :(得分:2)

试试这个,

您可以使用use将数据传递到闭包。

<?php
function abc($YesNo){return $YesNo["value"];}
$YesNo = array("value"=>"No","text"=>"No");
$x = array("active"=>function() use ($YesNo) {return abc($YesNo);});
echo $x['active']();
?>

答案 1 :(得分:1)

您为匿名函数提供参数:

$x = array("active"=>function($param){return abc($param);});

然后你称之为:

echo $x['active']($YesNo);

您可以使用use关键字让您的函数了解外部变量:

$x = array("active"=>function() use ($YesNo) {return abc($YesNo);});

但在这种情况下,它会完全违背可重用性的想法。

答案 2 :(得分:1)

问题是由于Variable Scope而无法在函数中访问您的变量。

因为数组是在函数外部 定义的,所以函数内部默认情况下

有几个解决方案

免责声明:这些内容适合于问题范围。我理解他们不一定是最佳实践,这需要更大的讨论

第一选择: 您可以在函数中声明数组,如下所示。如果您不需要在函数外部访问它,这将非常有用。

function abc($YesNo){
    $YesNo = array("value"=>"No","text"=>"No");
    return $YesNo["value"];
}

第二种选择: 在您的abc函数中,您可以添加行global $YesNo。如果执行需要访问函数外部的数组,这非常有用:

function abc($YesNo){
    global $YesNo;
    return $YesNo["value"];
}

存在其他选项(例如moonwave99的回答)。

最后: 为什么要在$ x的数组中放置一个匿名函数?似乎是一条将导致问题的道路......

答案 3 :(得分:1)

您的变量$ YesNo需要在匿名函数的范围内可见。您需要添加全局$ YesNo作为该函数中的第一个语句:

所以

$x = array("active"=>function(){return abc($YesNo);});

变为

$x = array("active"=>function(){global $YesNo; return abc($YesNo);});

...也“value”=&gt;“否”应为“value”=&gt;“是”如果您希望它返回“是”