匿名函数在PHP 5.3中被引入。
如果你使用的是旧版本的PHP,你需要使用create_function()
函数。它也会产生一个匿名函数,没有功能上的区别,只是语法不太好看,并且没有use
的等效功能:
$field = $this->sorting;
usort(
$this->out_table["rows"],
create_function(
// the list of arguments
'$a, $b',
// the function body (everything you normally put between { and }
'global $field; return strnatcmp($a[$field], $b[$field]);'
)
);
为避免使用
global
(如果将此代码放在函数/方法中,它甚至不起作用),您可以尝试编写一个将
$field
作为参数并创建比较函数的函数(类似于JavaScript闭包)。
这很容易使用匿名函数完成(但不需要),也可以使用
create_function()
轻松完成(虽然需要转义)。
function fn($fld)
{
$fld = addslashes($fld);
return create_function(
'$a, $b', // arguments
"return strnatcmp(\$a['$fld'], \$b['$fld']);" // function body
);
}
usort($this->out_table["rows"], fn($field));
函数fn()
基本上以旧版PHP(5.3之前)的方式从您的代码中创建匿名函数。
请注意,由于比较函数的主体是使用参数$fld
的内容生成的,因此对于某些$fld
的值,它可能会产生运行时错误(实际上是编译错误,但由于生成的函数主体是在运行时创建和解析的,因此直到太晚才能检测到这些错误)。
另一个比create_function()
更好的选项是为此目的创建一个类,如this answer所述。
>= 5.30
。详细内容请参考:http://php.net/manual/en/functions.anonymous.php。 - ʰᵈˑClosure
类的实例,根据官方文档,该类在5.3版本才被引入。建议升级你的PHP版本,因为5.2版本已经过时了。 - Elias Van Ootegem