34

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

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

5 回答 5

39

您可以在此处找到您要查找的信息,此处提供了 RFC。

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

  • 模拟测试变得容易。为接口创建动态实现,避免使用复杂的模拟 API。
  • 将这些类的使用保持在它们定义的范围之外
  • 避免为琐碎的实现点击自动加载器
于 2015-07-15T20:10:42.960 回答
6

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

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());
}
于 2020-04-01T09:32:25.350 回答
4

正如 Rasmus Lerdorf 在 WeAreDevelopers See 网站上所说,当他谈论 PHP7 的新特性时:

(在YouTube上观看)

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

编辑

考虑到 Lerdorf 先生的上述引用,匿名课程并不意味着真的没用。

例如,通过同时定义和实例化类,这对于某种单例模式很有用。

或者,另一个例子是用它实现嵌套类。是的,这是可能的。有关更多详细信息,请在此处查看我的答案

于 2018-09-10T15:25:46.433 回答
3

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

$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));
    }
});
于 2017-05-30T18:46:57.340 回答
0

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

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

于 2016-12-04T03:43:20.703 回答