最近偶然发现了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);
的使用是无效的。