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


PHP 5.4 Anonymous Function in Array undefine

这是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']();
?>

注意:未定义变量:YesNo在第7行
输出应该是:Yes

如果我直接将数组放入代码中,可以像

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

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

试试这个,

你可以使用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']();
?>

为匿名函数提供一个参数:

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

那么你叫它:

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

您可以使用use关键字使您的函数意识到外部变量:

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

但是在这种情况下,它将与可重用性的想法背道而驰。

问题是,由于变量作用域,您的变量在函数内不可访问。

由于数组是在函数外部定义的,因此默认情况下,在函数内部不可用。

有几个解决方案

免责声明:这些是为了适应问题的范围。我知道它们不一定是最佳实践,这需要更大的讨论

第一选择:可以在函数中声明数组,如下所示。如果你不需要在函数之外访问它,这是很有用的。

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数组中放入一个匿名函数?似乎是一条会导致问题的道路....

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

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

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

…如果你想让它返回"Yes"的话"value"=>"No"也应该是"value"=>"Yes"