PHP 中匿名函数的实际用例
PHP中 的匿名类允许你动态创建一个类,而不必定义新类。当想要创建一个只使用一次的类时,它们特别有用。
下面的 memoize helpler 函数使用匿名类来缓存函数调用的结果。
function memoize($target)
{
static $memo = new WeakMap;
return new class ($target, $memo) {
function __construct(
protected $target,
protected &$memo,
) {}
function __call($method, $params)
{
$this->memo[$this->target] ??= [];
$signature = $method . crc32(json_encode($params));
return $this->memo[$this->target][$signature]
??= $this->target->$method(...$params);
}
};
}
请注意,该函数使用了 PHP 的 __call()
魔术方法,在目标对象上调用该方法以获得其优势。由于只能在类上使用 __call()
魔术方法,因此使用匿名类就发挥作用。
假设你使用了常规类实现某些逻辑。你就必需定义一个类,然后在类中实现 __call()
魔术方法。
以下是与上述匿名类相同功能的等效类。
class Memoize
{
function __construct(
protected $target,
protected &$memo,
) {}
public function __call($method, $params)
{
$this->memo[$this->target] ??= [];
$signature = $method . crc32(json_encode($params));
return $this->memo[$this->target][$signature]
??= $this->target->$method(...$params);
}
}
如你所见,这不再是一个你可以直接“嵌入”并开始使用的助手函数。你必须定义一个类,然后实例化它,然后调用该对象上的方法。对于一个简单的 helper 函数来说,这是大量的样板代码,并且失去了方便性。
匿名类可以解决这样的问题。它们允许你随时创建一个类,并便利自己。这正是 memory()
函数的作用。
因此,简而言之,当我们有一个用例,我们想在独立函数中使用类特性,但不想定义独立的类时,匿名类是最好的选择。