web-dev-qa-db-ja.com

PHP 7の匿名クラス

PHP 7に記載されている匿名クラスはどこで使用でき、どのように使用すればよいですか?それらのユースケースが見つかりません。

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

RFCが提示されている here で探している情報を見つけることができます。

セクションの重要なポイントUse casesは次のとおりです。

  • 模擬テストはパイのように簡単になります。インターフェースのオンザフライ実装を作成し、複雑なモックAPIの使用を回避します。
  • これらのクラスの使用は、それらが定義されているスコープの外に置いてください
  • 簡単な実装でオートローダーにぶつからないようにする
28
marcosh

Rasmus LerdorfがWeAreDevelopersで言ったように ウェブサイトを参照、彼がPHP7の新機能について話していたとき:

(それを見る YouTube

匿名クラスは、匿名関数と同じです。基本的に、オンザフライでクラスを起動し、それらを破棄できます。個人的には、これを使用したことがありませんが、これが重要であると言うフレームワークの人々がいます。私はまだ少し怪しいですが、実装は簡単でした。そして、私より賢い人は「うん、うん、それは便利だ」と言った! OK!

3
MAChitgarha

私が提供できる良いケースは、カスタムクラスを定義せずに、コンテキスト固有のリスナーを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));
    }
});
1
ryabenko-pro

これは、トレイトの単体テストを作成するときにも役立つので、トレイトメソッドのみをテストできます。

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());
}
0
W_Opoczynski

匿名クラスは、PHPで通常のクラスと同じです。ただし、同時に作成およびインスタンス化する必要があることを除きます。つまり、他のクラスから拡張したり、インターフェースを使用したりできます。

非常に単純なクラスが必要で、他の場所では二度と使用しないと思われる場合は、それが適切です。別の理由としては、単純なクラス(複数の単純なメソッドを持つ)が必要であり、ドキュメント作成に時間をかけたくないので、外出先でクラスを作成してタスクを達成することが考えられます。

0
Mert Metin