PHP 7の匿名クラス
PHP 7に記載されている匿名クラスはどこで使用でき、どのように使用すればよいですか?それらのユースケースが見つかりません。
$message = (new class() implements Message {
public function getText() { return "Message"; }});
RFCが提示されている here で探している情報を見つけることができます。
セクションの重要なポイントUse cases
は次のとおりです。
- 模擬テストはパイのように簡単になります。インターフェースのオンザフライ実装を作成し、複雑なモックAPIの使用を回避します。
- これらのクラスの使用は、それらが定義されているスコープの外に置いてください
- 簡単な実装でオートローダーにぶつからないようにする
私が提供できる良いケースは、カスタムクラスを定義せずに、コンテキスト固有のリスナーを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));
}
});
これは、トレイトの単体テストを作成するときにも役立つので、トレイトメソッドのみをテストできます。
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());
}
匿名クラスは、PHPで通常のクラスと同じです。ただし、同時に作成およびインスタンス化する必要があることを除きます。つまり、他のクラスから拡張したり、インターフェースを使用したりできます。
非常に単純なクラスが必要で、他の場所では二度と使用しないと思われる場合は、それが適切です。別の理由としては、単純なクラス(複数の単純なメソッドを持つ)が必要であり、ドキュメント作成に時間をかけたくないので、外出先でクラスを作成してタスクを達成することが考えられます。