はじめに
PHPでは、オブジェクトのクラス名を取得する方法として get_class() 関数と ::class 定数表現があります。
実は、PHP 8.0 以降、この2つの動作はほぼ同じ結果を返すようになっています。本記事では、試験で混同しやすいこの2つの違いと、実際の挙動をサンプルコードでわかりやすく整理します。
目次
◆ get_class() 関数とは
get_class() は、指定したオブジェクトのクラス名を文字列で返す関数です。
構文は次のとおりです:
get_class(object $object = ?): string引数にオブジェクトを渡すと、そのクラス名(完全修飾クラス名)が返されます。
(引数を省略すると、関数が呼ばれたクラスの中であれば「現在のクラス名」を返します)
◆ ::class の基本動作
::class は、クラス定数としてクラス名を取得する構文です。
PHP 7 以前は「クラス名::class」という形でしか使えませんでしたが、PHP 8.0 以降はオブジェクト変数に対しても使用可能になりました。
つまり、次のような書き方ができるようになっています:
$obj = new stdClass();
echo $obj::class; // PHP8 以降 OKこのとき、実行結果は get_class($obj) と同じ "stdClass" になります。
◆ 実際の挙動を確認してみよう
<?php
declare(strict_types=1);
error_reporting(-1);
$obj = new stdClass();
$s = get_class($obj);
var_dump($s); // string(8) "stdClass"
$s = $obj::class;
var_dump($s); // string(8) "stdClass"出力結果:
string(8) "stdClass"
string(8) "stdClass"✅ 結果はどちらも 同じ「stdClass」
✅ PHP 8 では ::class が 実行時に解決されるため、get_class() と同等の動きをします。
◆ 図解:get_class() と ::class の関係
┌──────────────────────────────────────┐
│ クラス名取得の仕組み │
├──────────────────────────────────────┤
│ get_class($obj) → 実行時にクラス名取得 │
│ $obj::class → 実行時にクラス名取得 │
├──────────────────────────────────────┤
│ ※ PHP8 以降は同等の結果になる │
└──────────────────────────────────────┘◆ まとめ
| 比較項目 | get_class() | ::class |
|---|---|---|
| 登場時期 | PHP4 から | PHP5.5〜(PHP8で拡張) |
| 使用対象 | オブジェクト | クラス名・オブジェクト |
| 解決タイミング | 実行時 | コンパイル時(PHP8以降は実行時) |
| PHP8での関係 | 同等の動作をする | 同等の動作をする |
