【问题标题】:PHP 5.4 Anonymous Function in Array undefinePHP 5.4 数组中的匿名函数 undefine
【发布时间】:2013-06-10 04:44:18
【问题描述】:

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

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

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

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

【问题讨论】:

  • $YesNo 不在匿名函数的范围内。另外,这不是我所说的“可重用”代码。
  • 那么如何处理这个变量
  • 使用function() { global $YesNo; return abc($YesNo); }
  • 我建议阅读这篇关于匿名函数的帖子:stackoverflow.com/a/4147510/870729

标签: php arrays variables indexing undefined


【解决方案1】:

试试这个,

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

【讨论】:

  • 我的,如果匿名函数像这样使用($YesNo),我会讨厌匿名函数......多么奇怪的语法
【解决方案2】:

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

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

那你叫它:

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

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

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

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

      所以

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

      变成

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

      ...如果您希望它返回“Yes”,“value”=>“No”也应该是“value”=>“Yes”

      【讨论】:

        猜你喜欢
        • 2015-01-27
        • 2014-09-11
        • 1970-01-01
        • 1970-01-01
        • 2012-07-10
        • 2011-01-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多