-1

这是 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
输出应该是:是

如果我通过替换 $YesNo 直接将数组放入代码中

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

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

4

4 回答 4

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']();
?>
于 2013-06-13T17:18:52.827 回答
1

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

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

然后你称之为:

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

您可以使用use关键字使您的函数知道外部变量:

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

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

于 2013-06-13T17:21:22.530 回答
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 的数组中放置一个匿名函数?似乎是一条会导致问题的道路......

于 2013-06-13T17:25:52.290 回答
1

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

所以

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

变成

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

...如果您希望它返回“是”,“值”=>“否”也应该是“值”=>“是”

于 2013-06-13T17:27:29.953 回答