PHP
 Computer >> コンピューター >  >> プログラミング >> PHP

PHP 7の匿名クラス(Anonymous Class)とは?基本構文と活用メリットを解説

PHP 7の匿名クラスとは

PHP 7で導入された匿名クラス(Anonymous Class)は、new classという構文を使って、名前を持たないクラスをその場で定義できる機能です。通常のクラス定義のように事前に宣言しておく必要がなく、インスタンス化と同時にクラスを定義できるため、一時的なオブジェクトが必要な場面で非常に便利です。

また、匿名クラスは完全なクラス定義の代わりとしても利用できます。継承・インターフェースの実装・トレイトの利用といった、通常のクラスと同じ機能をすべて備えています。

匿名クラスを使うメリット

  • モックによるテストが簡単に行える:テスト専用の一時的なクラスを、わざわざ別ファイルとして定義する必要がありません。
  • インターフェースを動的に実装できる:複雑なモッキングAPIに頼ることなく、必要な実装をその場で記述できます。
  • 定義したスコープ内に配置できる:使用する箇所の近くでクラスを定義できるため、コードの意図が読み取りやすくなります。
  • シンプルな実装にオートローダーが不要:小さな実装のためにクラスファイルを作成し、オートローダーに登録する手間を省けます。

コード例

以下は、ロガーインターフェースに対して匿名クラスを実装するサンプルコードです。

<?php
interface a_logger {
    public function log(string $msg);
}
class App {
    private $logger;
    public function getLogger(): a_logger {
        return $this->logger;
    }
    public function setLogger(a_logger $logger) {
        $this->logger = $logger;
    }
}
$app = new App;
$app->setLogger(new class implements a_logger {
    public function log(string $msg) {
        print($msg);
    }
});
$app->getLogger()->log("This has created an anonymous class");
?>

コードの解説

この例では、まずa_loggerインターフェースを定義し、log(string $msg)メソッドの実装を要求しています。Appクラスは、このインターフェース型を受け取るsetLogger()メソッドを通じてロガーを注入(依存性注入)できる構造になっています。

ポイントは次の行です。

$app->setLogger(new class implements a_logger { ... });

new class implements a_logger の部分で、クラスに名前を付けずにa_loggerインターフェースを実装した匿名クラスをその場で定義し、直接setLogger()に渡しています。このように、一度きりしか使わない簡単な実装を、クラス定義用のファイルを分けることなく簡潔に記述できるのが匿名クラスの強みです。

出力結果

上記のコードを実行すると、以下の出力が得られます。

This has created an anonymous class

匿名クラスのlog()メソッドが正しく呼び出され、引数として渡された文字列が出力されていることが分かります。


  1. PHPのget_class_methods()関数とは?使い方をわかりやすく解説

    get_class_methods()関数の概要PHPのget_class_methods()関数は、指定したクラスに定義されているメソッド名の一覧を取得するための関数です。引数に渡されたクラス(name_of_class)に定義されたすべてのメソッド名を配列として返し、エラーが発生した場合はNULLを返します。構文get_class_methods(class)パラメータname_of_class − メソッド名を取得したいクラス名を文字列またはオブジェクトで指定します。必須パラメータです。戻り値get_class_methods()関数は、name_of_c

  2. PHPのclass_exists()関数とは?使い方とサンプルコードをわかりやすく解説

    概要PHPのclass_exists()関数は、指定したクラスがすでに定義されているかどうかをチェックするための関数です。クラスが定義済みであればTRUEを、未定義であればFALSEを返します。プラグインの読み込みや条件分岐によるクラスの動的な利用など、柔軟なプログラミングに役立ちます。構文class_exists(class, autoload)パラメータclass − 存在を確認したいクラスの名前。autoload − デフォルトでオートロード機構(__autoload / spl_autoload_call)を呼び出すかどうか。省略した場合のデフォルト値はTRUE