PHP7調査(26)無名クラスの導入

  • 24
    Like
  • 0
    Comment
More than 1 year has passed since last update.

PHP7から無名クラスがサポートされました。次のような文法で、クラス定義なしでオブジェクトが生成できます。

<?php
$obj = new class(/* コンストラクタ引数 */) {
    /* クラス本体 */
};

通常のクラス定義と同様にextendsimplementsなども書くことができます。

この構文はnewまで必須です。newなしで無名クラスが第1級オブジェクトになりそうに見えますが、現時点ではそのような記述はできません。無名クラスのインスタンスを作ることだけが可能です。

ユースケース

RFCによれば次のような状況で便利なのでは?とのことでした。

  • テスト用のモックオブジェクトで、その場限りでインターフェースを実装する状況。
  • そのクラスを外部に公開したくないような場合
    • オブジェクトメソッドが呼ばれたりするのは構わないが、継承して使われるのがイヤな場合…?
  • 自明な実装でオートローダーを叩きたくない
    • 1クラス1ファイルというルールで運用している場合、1ファイル増えてしまうのが悲しいこともありそう

そうでなくても、最近のオシャレなライブラリは「このインターフェース実装したオブジェクトを引数に渡してね」といったものが珍しくないため、使いどころは多いように思います。

実行例

あまり実用性はありませんが、他の言語と同様にオブジェクトを連想配列のように扱うこともできます。

<?php
$obj = new class { public $foo = 3; public $bar = 4; };
var_dump($obj->foo); // int(3)
var_dump($obj->bar); // int(4)

感想など

仕方ないことですが、各種エディタ類がPHP7に対応するまで、この構文を使うとインデントが崩れまくります。

参照

PHP RFC: Anonymous Classes