在 PHP 中“逃避”了“usort”中的排序函数?致命错误:无法重新声明函数


Sort Function in 'usort' being "evaled" in PHP? Fatal error: cannot redeclare function?

最近偶然发现了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');

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

--编辑--

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

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

--

编辑 2 --

也许,这在 PHP 5.3 中效果很好,只需阅读它有闭包,是的!

每次

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

要解决此问题,请检查function myCmpFunc($a,$b)的正文中是否function_exists

从 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);

函数声明在 myCmpFunc 内部,并且由于usort会为数组的每个元素调用 myCmpFunc,因此发生的情况类似于声明函数 N 次。

问题是在使用内部函数之前必须调用外部函数。根据对类似问题的回答,我可以在另一个函数中包含函数吗?

因此,您对inner($a);的使用是无效的。