PHP 7中的匿名类

时间:2015-07-15 14:39:16

标签: php anonymous-class php-7

我可以在哪里使用,我应该使用PHP 7中提供的匿名类吗?我无法为他们找到一个用例。

$message = (new class() implements Message {
public function getText() { return "Message"; }});

5 个答案:

答案 0 :(得分:26)

您可以找到您要查找的信息here,其中包含RFC。

onDestroy()部分的要点如下:

  • 模拟测试变得很容易。为接口创建动态实现,避免使用复杂的模拟API。
  • 将这些类的使用限制在
  • 中定义的范围之外
  • 避免使用自动加载器进行简单的实现

答案 1 :(得分:2)

正如Rasmus Lerdorf在WeAreDevelopers See website 上谈到PHP7的新功能时所说:

(在YouTube上观看)

  

匿名类,就像匿名函数一样;基本上,您可以即时启动课程并丢弃它们。就个人而言,我从来没有用过它,但是有些框架人员说这很重要。我还是有点怀疑,但是很容易实现。还有比我聪明的人说:“是的,这很有用”!好吧!

答案 2 :(得分:2)

在为特质编写单元测试时,我还发现这很有用,因此您只能测试特质方法,即:

trait MyTrait 
{
    public method foo(): string
    {
        return 'foo';
    }
}
...
public function setUp(): void
{
    $this->testObject = (new class() {
        use MyTrait;
    });
}
public function testFoo(): void
{
    $this->assertEquals('foo', $this->testObject->foo());
}

答案 3 :(得分:1)

我可以提供的好的情况是提供上下文特定的侦听器,只使用一次或外部侦听器的适配器,而无需定义自定义类。这是一个例子:

$this-apiCaller->call('api_name', $parameters, new class($businessListener) implements ApiListenerInterface 
{ 
    private $listener;

    public function __construct($originalListener)
    {
        $this->listener = $originalListener;
    }

    public function onSuccess($result)
    {
        $this->listener->addLog(new SuccessRecord($result));
    }

    public function onFailure($error)
    {
        $this->listener->addLog(new ErrorRecord($error));
    }
});

答案 4 :(得分:0)

匿名类与PHP中的常规类没有什么不同,除非它们需要同时创建和实例化。这意味着它们可以从其他类扩展,可以使用接口等。

如果您认为自己需要一个非常简单的课程而不再在其他任何地方再次使用它,那么它就适合您。另一个原因可能是您需要一个简单的类(使用多种简单方法)并且您不想花时间编写文档,因此您可以随时创建一个来完成任务。