【问题标题】:Anonymous classes in PHP 7PHP 7 中的匿名类
【发布时间】:2026-02-15 20:30:01
【问题描述】:

我可以在哪里使用以及应该使用 PHP 7 中提供的匿名类?我找不到他们的用例。

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

【问题讨论】:

标签: php anonymous-class php-7


【解决方案1】:

您可以找到您正在寻找的信息here,其中提供了 RFC。

“用例”部分的重点如下:

  • 模拟测试变得容易。为接口创建动态实现,避免使用复杂的模拟 API。
  • 将这些类的使用保持在它们定义的范围之外
  • 避免因为琐碎的实现而点击自动加载器

【讨论】:

    【解决方案2】:

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

    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】:

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

      (在YouTube观看)

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

      编辑: 考虑到上面 Lerdorf 先生的引用,匿名类并不意味着真的没用,尽管它的用例可能看起来很少。例如,通过同时定义和实例化类,它对某种单例模式很有用。

      【讨论】:

        【解决方案4】:

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

        $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));
            }
        });
        

        【讨论】:

          【解决方案5】:

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

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

          【讨论】: