《PHP8上級試験対策》get_class() と ::class の違いと共通点を正しく理解する

  • URLをコピーしました!

はじめに

PHPでは、オブジェクトのクラス名を取得する方法として get_class() 関数と ::class 定数表現があります。
実は、PHP 8.0 以降、この2つの動作はほぼ同じ結果を返すようになっています。本記事では、試験で混同しやすいこの2つの違いと、実際の挙動をサンプルコードでわかりやすく整理します。

キーワード: get_class / ::class / クラス名取得 / PHP8 / オブジェクト指向

目次

◆ 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での関係同等の動作をする同等の動作をする

この記事が気に入ったら
いいねしてね!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次