使用一种方法与__invoke进行接口

时间:2017-12-28 16:59:14

标签: php

我正在阅读关于CQRS的内容,我刚刚遇到了动作处理程序而不是好的旧MVC控制器(因此,使用一堆动作/方法代替AuthController,将每个方法转换为处理程序类)。

对我而言,新手是一个使用单一方法__invoke的callabe类(处理程序)。到目前为止,我将使用一个名为handle的方法创建一个接口,并让我的动作处理程序实现此接口。这就是我的教学方式。

另一方面,这个调用的东西看起来很花哨。一般来说,我不喜欢在PHP中使用魔术方法,这主要是因为它很神奇,但这种方法不同。这很有道理,因为我的界面正在模仿这种行为。 Afaik Java没有这种神奇的方法,所以他们必须实现Runnable(或其他东西),但如果我们 - 作为PHP开发人员 - 拥有它,为什么不使用它呢?

如果有一个“更简单”的方法,我不想陷入这个企业级的Java-Developer陷阱并保持我的界面所有成本。你能否给出使用这两种方法的优点和缺点?

就个人而言,这种神奇的方法对我来说并不合适,但我有偏见,这就是为什么我想听听你的意见。

1 个答案:

答案 0 :(得分:2)

使用__invoke - 魔术方法没有错。即使callable类型提示也适用于此模式。

class a {
    public function __invoke() {
        echo "OK!";
    }
}

function b(callable $x) {
    $x();
}

$a = new a();
$a();
b($a);
var_dump(is_callable($a));

关于这一点的好处是,它完全适合于该方案,并且赋予您创建期望可调用类型的方法的能力,甚至可以传递复杂的“lambdas”,如整个类而不是“简单”闭包。

这种方法唯一的缺点 - 它使初学者的事情变得复杂,因为他们不了解它们(就像所有其他魔术方法一样)。和所有其他魔术方法一样,这也会对性能产生一些影响。但在这种情况下,开销很小,你不应该关心。