我不敢苟同。的确,很多时候这并不重要。但有时它很重要。
持有对 的引用的闭包$this
可能会阻止对该对象的垃圾收集,这反过来也可能会显着影响性能。这是一个真正产生巨大差异的示例:
class LargeObject {
protected $array;
public function __construct() {
$this->array = array_fill(0, 2000, 17);
}
public function getItemProcessor(): Closure {
// Try with and without 'static' here
return static function () {
// do some processing unrelated to $this
};
}
}
$start = microtime(true);
$processors = [];
for ($i = 0; $i < 2000; $i++) {
$lo = new LargeObject();
$processors[] = $lo->getItemProcessor();
}
$memory = memory_get_usage() >> 20;
$time = (microtime(true) - $start) * 1000;
printf("This took %dms and %dMB of memory\n", $time, $memory);
这是正常关闭的输出:
This took 55ms and 134MB of memory
这是带有静态闭包的输出:
This took 22ms and 1MB of memory
我在 Debian Buster 上使用 PHP 7.3.19 对此进行了测试,所以是 YMMV。显然,这是一个特殊构造的例子来展示差异。但类似的事情也可能发生在实际应用中。我开始使用 Slevomat 的SlevomatCodingStandard.Functions.StaticClosure嗅探来提醒我始终使用静态闭包。