编程

PHP 中匿名函数的实际用例

205 2024-03-29 23:21:00

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() 函数的作用。

因此,简而言之,当我们有一个用例,我们想在独立函数中使用类特性,但不想定义独立的类时,匿名类是最好的选择。

 

PHP