ツイート
シェア
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, パラメータやリターン値が変わる関数。リターン値の判定は注意が必要。
PHP8, 部分文字列を扱う新しい関数の追加。新機能というより関数の意図の整理。
次の投稿

コメントを残す