::class は、'::' が付いても分かるように静的クラス、newでインスタンスを作成しないクラスの専売特許でした。
それが、バージョンアップしたPHP8からクラスオブジェクトでも使えるようになりました。
get_class()と同じで、ただクラス名の文字列を返すだけのなんの見栄えもないですが。
::classは、静的なpublicプロパティで、クラス名の文字列が入ってます。
class Test
{
}
$class_name = Test::class;
var_dump($class_name);
実行結果
string(4) "Test"
これが、PHP8.0からnew演算子で作成したインスタンスでも使えるようになりました。
class Test
{
}
$test = new Test();
$class_name = $test::class;
var_dump($class_name);
実行結果
string(4) "Test"
インスタンスなのに '::' を使ってるところがポイント。'->' を使うと警告が発生します。
<?php
class Test
{
}
$test = new Test();
$class_name = $test->class;
var_dump($class_name);
実行結果
PHP Warning: Undefined property: Test::$class in /home/vagrant/php-test.php on line 9
NULL
当然、クラス名取得も失敗してNull。
内部では、public static $class とかで定義されてるんでしょうね?
または、::classのことをclassキーワードと呼ぶので、プロパティではなく特殊なものなのかもしれない。
これは、get_class()でも同じ結果になります。
class Test
{
}
$test = new Test();
$class_name = get_class($test);
var_dump($class_name);
実行結果
string(4) "Test"
get_class() はインスタンスをパラメータに指定するので、静的クラス(static)では使えません。
::classがstaticとインスタンスの両方で使えるようになったので、この関数の存在意義がなくなりました。
PHP公式ドキュメント
最後に、PHP7で使うと致命的なエラーになります。
<?php
class Test
{
}
$test = new Test();
$class_name = $test::class;
var_dump($class_name);
PHP7.4での実行結果
PHP Fatal error: Cannot use ::class with dynamic class name in /home/vagrant/php-test.php on line 9
あまりにもかんたんすぎて、PHP7でも使えるんじゃないか? と思ってしまうほどなので念のため。
PHP公式ドキュメント