2011-05-10 86 views
1

最近偶然发现了在PHP这个整洁的小 错误或 “功能”:在'usort'中排序函数在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 Fatal error: Cannot redeclare function

因此,这里是我的问题,然后: 是否有可能在声明功能本地范围?

- 编辑2 -

也许,这非常适用于PHP 5.3刚才读它关闭,yeehaa!

+0

这是个问题吗? – 2011-05-10 15:11:14

+2

编写代码*编译*但是*无效*不构成PHP *错误*。 – 2011-05-10 15:13:21

+0

@ jason-mccreary你是对的。尽管如此,我发现在函数中声明函数并将它们放在外函数的局部范围内是很有用的。 不在PHP中,因为函数总是在全局范围内,我学会了。然后必须使用方法。 – 2011-05-11 06:29:45

回答

2

function inner($p)每当执行function myCmpFunc($a,$b)时被定义。此外,内部函数在function myCmpFunc($a,$b)之后可见(这几乎意味着允许嵌套函数定义)。这就是为什么当你第二次调用外部函数时会出现重复的定义错误。

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

+0

你一定是对的,那个函数总是被**添加到全局范围中。 – 2011-05-10 15:24:32

1

函数声明是内部myCmpFunc,并且因为usort称之为myCmpFunc用于阵列中的每个元素,会发生什么情况类似于声明一个函数N次。

1

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

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

+0

myCmpFunc在内部调用之前被调用... – 2011-05-10 15:21:14

+0

@ line-o,不在myCmpFunc的主体内 – Jordan 2011-05-10 15:24:29

+0

这只适用于在条件内声明的函数。 – 2011-05-11 06:35:17

0

由于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);