phpで開発中になんとなく::class
を使っていたけど、ちゃんと挙動を理解していなかったのでまとめる。
公式を見る
::class
class キーワードでもクラス名の解決を行うことが出来ます。 クラスの名前が ClassName になっているクラスの完全修飾名を取得するにはClassName::class を使います。 これは、名前空間付きのクラスに使うと特に便利です。例14 クラス名の解決
<?php namespace NS { class ClassName { } echo ClassName::class; } ?>
上の例の出力は以下となります。
NS\ClassName
引用元: https://www.php.net/manual/ja/language.oop5.basic.php#language.oop5.basic.class.class
クラスを指定する時にいちいち長ったらしい、名前空間とかを入力しなくても、「::class
を使えば全部取得するよ」って感じ。
やってみる
<?php
namespace Sample\Test;
use Hello\Test\B;
class A
{
//
}
echo A::class . PHP_EOL;
echo B::class . PHP_EOL;
出力結果↓
Sample\Test\A
Hello\Test\B
それぞれ、クラス名::class
で完全修飾名が取得できている。
未定義のクラスでもエラーにならない
実は↑のBクラスはどこにも定義されていない。存在しなくてもuse文に書いてあるとおりに出力されてしまう。
namespaceのuse句では
実際に対象が使用されるまでエラーは検査されない