“usort”中的排序函数在PHP中被“唤醒”了吗?致命错误:无法重新声明功能?

时间:2011-05-10 15:05:52

标签: php function callback eval php-5.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');

myCmpFunc 之外声明函数 inner 时,它可以正常运行 和/或 $ myArray 不超过2个元素;)

- 编辑 -

以某种方式相关: PHP Fatal error: Cannot redeclare function

所以这是我的问题,然后: 是否可以在 local 范围内声明函数?

- 编辑2 -

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

4 个答案:

答案 0 :(得分:2)

每次执行function inner($p)时都会定义

function myCmpFunc($a,$b)。此外,在此之后,内部函数在function myCmpFunc($a,$b)之外可见(这几乎可以理解为允许嵌套函数定义)。这就是你第二次调用外部函数时出现重复定义错误的原因。

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

问题是你必须在使用内部函数之前调用外部函数。根据对类似问题的回答Can I include a function inside of another function?

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

答案 3 :(得分: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);