ツイート
シェア
LINEで送る
B! はてぶでブックマーク
Pocketでブックマーク
RSSフィード

PHP8, ::classがクラスオブジェクトでも使える。get_class() と同じ。

php
イラストダウンロードサイト【イラストAC】
の画像をもとに加工しています。

::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公式ドキュメント

Function - get_class

最後に、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でも使えるんじゃないか? と思ってしまうほどなので念のため。

前の投稿
PHP8, 例外処理(throw)がNull合体演算子で使えるようになった。
PHP8, Stringableインタフェース, 文字列への変換(キャスト)を強制するクラスにする
次の投稿
コメントを残す

*