2

最近在 PHP 中偶然发现了这个简洁的小错误或“功能”:

function myCmpFunc($a,$b) {
    function inner($p) {
         // do something
    }
    $inner_a = inner($a);
    $inner_b = inner($b);
    if ($inner_a == $inner_b) return 0;
    return ($inner_a > $inner_b ? -1 : 1);
}

像这样调用时导致致命错误“无法在...中重新声明函数内部”

usort($myArray, 'myCmpFunc');

当函数inner在myCmpFunc之外声明 和/或 $myArray的元素不超过 2 个时,它可以完美地工作;)

- 编辑 -

不知何故相关: PHP致命错误:无法重新声明函数

那么这是我的问题:是否可以在本地范围内声明函数?

-- 编辑 2 --

也许,这在 PHP 5.3 中运行良好,只是阅读它有闭包,耶哈!

4

4 回答 4

2

function inner($p)每次function myCmpFunc($a,$b)执行时都会定义。此外,在此之后内部函数在外部可见function myCmpFunc($a,$b)(这几乎使嵌套函数定义失去了意义)。这就是第二次调用外部函数时出现重复定义错误的原因。

要解决此问题,请检查function_exists.function myCmpFunc($a,$b)

于 2011-05-10T15:15:11.410 回答
1

函数声明在 inside myCmpFunc,因为usort会调用myCmpFunc数组的每个元素,所以发生的情况类似于声明一个函数 N 次。

于 2011-05-10T15:10:42.577 回答
1

从 PHP v5.3 开始,现在可以用一种很好的方式编写它:

$myCmpFunc = function ($a, $b) {
    static $inner = function ($element) {
         return $element['width']; // just as an example
    };
    $inner_a = $inner($a);
    $inner_b = $inner($b);
    if ($inner_a == $inner_b) return 0;
    return ($inner_a > $inner_b ? -1 : 1);
};
usort($anArray, $myCmpFunc);
于 2013-06-13T15:31:13.220 回答
1

问题是您必须在使用内部函数之前调用外部函数。根据this answer to a similar question我可以在另一个函数中包含一个函数吗?

所以你的使用inner($a);是无效的。

于 2011-05-10T15:12:51.963 回答