1

我不知道这样的东西(javascript-esque 内联函数)会在 PHP 中工作。作为一个花费大量时间编写 javascript/jquery 的人,当我的“我想知道这是否可行”的尝试实际上奏效时,我感到非常震惊。

usort($inbox_messages, function($a, $b){
    return strtotime($b["date"]) - strtotime($a["date"]);
});

现在,关于这样的实现,我应该知道什么吗?性能问题、向后兼容性、范围等。

这是常见的做法,还是糟糕的代码?

4

2 回答 2

2

如果您需要分发代码以在不同的环境中运行,则向后兼容性可能是一个问题。PHP 5.3之前不支持匿名函数。较旧的托管平台和企业服务器安装通常仍停留在 5.2.x 上,并带有供应商支持的 Linux 发行版等。

在过去的一年里,这种情况发生了迅速的变化,但随着这些旧装置的支持周期到期,几年后仍将是一个需要考虑的问题。

有关变量范围和use关键字的问题,请查看匿名函数的链接文档

于 2012-09-29T14:30:14.763 回答
2

这个特性被称为匿名函数,它从 PHP 5.3 开始可用:

匿名函数,也称为闭包,允许创建没有指定名称的函数。它们作为回调参数的值最有用,但它们还有许多其他用途。

他们的范围分辨率也有(轻微的)差异:

闭包也可以从父作用域继承变量。任何此类变量都必须在函数头中声明。从父作用域继承变量与使用全局变量不同。

所以,在这个例子中:

$total = 0.00;
$callback = function ($quantity, $product) use ($tax, &$total)
{
    $pricePerItem = constant(__CLASS__ . "::PRICE_" . strtoupper($product));
    $total += ($pricePerItem * $quantity) * ($tax + 1.0);
};
array_walk($this->products, $callback);

...从该文档页面中,$tax并且在不使用关键字$total的情况下有效地注入closure($callback) 范围。global

匿名函数实际上是Closure类的对象。而且它不仅仅是一个实现特性:因为(从 PHP 5.4 起)这些函数可以使用$this对象(类似于 JavaScript 中的上下文对象),有一些有用的方法可以改变这个上下文(Closure::bindCl​​osure::bindTo -例如,将它们与Function.bind进行比较)。

map更具体地说,在/ -ing 集合时使用匿名函数实际上是一个好习惯filter,因为这些函数不会进入全局范围。但是,当然,如果您需要您的代码在 PHP 5.2 上运行,这不是一个解决方案。

于 2012-09-29T14:36:42.083 回答