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

PHPの匿名クラス(無名クラス)完全解説!基本構文から継承・ネスト・内部名まで

はじめに

匿名クラス(無名クラス)とは、その名のとおり「名前を持たないクラス」のことです。一度きりの使用を目的としており、その場でクラスを定義したい場合に便利な機能です。PHPでは、PHP 7以降のバージョンから匿名クラスが利用できるようになりました。

匿名クラスは式の中で定義され、その式の評価結果として、そのクラスのオブジェクトが返されます。定義にはnew classという構文を使用します。

基本的な構文

最もシンプルな匿名クラスの書き方は以下のとおりです。

<?php
$obj = new class {
    public function sayhello() {
        echo "Hello World";
    }
};
$obj->sayhello();
?>

通常のクラスとの共通点

匿名クラスは、名前がないことを除けば通常のクラスとほぼ同じことができます。具体的には、以下のような操作が可能です。

  • 別のクラスを継承する(extends)
  • インターフェースを実装する(implements)
  • トレイトを使用する(use)

継承とインターフェース実装の例

次のコードでは、匿名クラスが親クラスを継承し、同時に親インターフェースを実装しています。

<?php
class parentclass {
    public function test1() {
        echo "test1 method in parent class\n";
    }
}
interface parentinterface {
    public function test2();
}
$obj = new class() extends parentclass implements parentinterface {
    public function test2() {
        echo "implements test2 method from interface";
    }
};
$obj->test1();
$obj->test2();
?>

出力結果

test1 method in parent class
implements test2 method from interface

ネストした匿名クラス

匿名クラスは、他のクラスのメソッド内に入れ子(ネスト)して定義することもできます。ただし注意点として、ネストされた匿名クラスのオブジェクトからは、外側のクラスのprivateやprotectedメンバーにはアクセスできません。

コード例

<?php
class testclass {
    public function test1() {
        return new class() {
            public function test2() {
                echo "test2 method of nested anonymous class";
            }
        };
    }
}
$obj2 = new testclass();
$obj2->test1()->test2();
?>

出力結果

test2 method of nested anonymous class

匿名クラスの内部名

匿名クラスには名前がないように見えますが、実際にはPHPパーサーが内部的な処理のために一意の名前を自動的に割り当てています。get_class()関数を使うことで、この内部名を確認できます。

コード例

<?php
var_dump(get_class(new class() {}));
?>

出力結果

string(60) "class@anonymous/home/cg/root/1569997/main.php0x7f1ba68da026"

まとめ

匿名クラスは、使い捨てのオブジェクトが必要な場面や、簡単なテスト用のモックを作成する際などに活躍します。通常のクラスと同じく継承・インターフェース実装・トレイト利用が可能でありながら、わざわざ名前付きクラスを定義する手間を省けるのが大きなメリットです。PHP 7以降の環境でぜひ活用してみてください。

  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