最近在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!
答案 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);