【PHP8.x】get_class関数の使い方

作成日: 更新日:

get_class関数は、指定されたオブジェクトのクラス名を取得する関数です。この関数は、プログラムの実行中にオブジェクトがどのクラスに属しているかを識別したい場合に非常に役立ちます。

通常、get_class関数はオプションで一つの引数を受け取ります。引数にオブジェクトを渡した場合、そのオブジェクトがインスタンス化されたクラスの完全な名前を文字列として返します。例えば、Userクラスのインスタンスである$userオブジェクトがある場合、get_class($user)は文字列'User'を返します。

引数を省略してget_class()と呼び出した場合、この関数が実行されているスコープ(特にクラスのメソッド内)で呼び出されたときに、そのメソッドが属するクラスの名前を返します。これは、クラス自身が自身のクラス名を知りたい場合に便利です。

この関数は、特定の処理を行う前にオブジェクトが期待するクラスのインスタンスであるかを確認したり、ログ出力やデバッグのためにオブジェクトの型情報を取得したりする際に利用されます。引数にオブジェクトではない値(null、整数、文字列など)が渡された場合、PHP 8.0以降ではTypeErrorが発生するため、オブジェクトを扱う際には注意が必要です。これにより、コードの堅牢性が向上し、予期せぬエラーを防ぐことができます。

基本的な使い方

構文(syntax)

<?php

class MyClass {}

$object = new MyClass();
$className = get_class($object);

引数(parameters)

?object $object = null

  • ?object $object = null: クラス名を取得したいオブジェクト。省略した場合、現在のクラスの名前が返されます。

戻り値(return)

string

指定されたオブジェクトのクラス名を文字列として返します。

サンプルコード

PHPでクラス定数を取得する

<?php

/**
 * このスクリプトは、クラスのインスタンスからクラス名を取得し、
 * そのクラスが定義している定数をすべて取得して表示する方法を示します。
 * システムエンジニアを目指す初心者向けに、簡潔で分かりやすい例です。
 */

/**
 * サンプルとなるクラスを定義します。
 * クラス定数がいくつか定義されています。
 */
class Product
{
    // 製品の状態を表す定数
    public const STATUS_ACTIVE = 'active';
    public const STATUS_INACTIVE = 'inactive';
    public const STATUS_ARCHIVED = 'archived';

    // デフォルトの通貨
    public const DEFAULT_CURRENCY = 'USD';

    // プロパティ
    private string $name;
    private string $status;

    public function __construct(string $name, string $status = self::STATUS_ACTIVE)
    {
        $this->name = $name;
        $this->status = $status;
    }

    public function getName(): string
    {
        return $this->name;
    }

    public function getStatus(): string
    {
        return $this->status;
    }
}

/**
 * Productクラスのインスタンスを作成します。
 */
$myProduct = new Product('Laptop', Product::STATUS_ACTIVE);

/**
 * get_class()関数を使用して、オブジェクトのクラス名を取得します。
 * これは、提供されたリファレンス情報に記載されている関数です。
 */
$className = get_class($myProduct);

echo "取得されたクラス名: " . $className . "\n\n";

/**
 * 取得したクラス名(文字列)を使用して、ReflectionClassをインスタンス化します。
 * ReflectionClassは、クラスに関する詳細な情報を取得するためのPHPの組み込みクラスです。
 */
$reflector = new ReflectionClass($className);

/**
 * getConstants()メソッドを使用して、クラスに定義されているすべての定数を取得します。
 * これにより、クラス定数とその値が連想配列として返されます。
 */
$classConstants = $reflector->getConstants();

echo "クラス定数:\n";
print_r($classConstants);

?>

このサンプルコードは、PHPでオブジェクトからそのクラス名を取得し、さらにそのクラスが定義している定数をすべて動的に取得して表示する方法を示すものです。

get_class関数は、指定されたオブジェクトがどのクラスに属しているかを知るために使われます。引数には?object $object = nullを取り、オブジェクトを渡すとそのクラス名を文字列として返します。もし引数を省略するかnullを指定した場合(クラスのメソッド内で呼び出した場合など)は、現在のスコープのクラス名を返します。戻り値は常にstring型で、クラス名が文字列として提供されます。

このコードでは、まずProductというクラスを定義し、いくつかのクラス定数を設定しています。次に、$myProductというProductクラスのインスタンスを作成します。

その後、get_class($myProduct)を実行することで、$myProductProductクラスのインスタンスであるため、"Product"というクラス名が文字列として取得され、変数$classNameに格納されます。

さらに、取得したクラス名("Product")を使ってReflectionClassのインスタンスを生成します。ReflectionClassは、実行時にクラスの構造に関する詳細な情報を取得するためのPHPの組み込みクラスです。$reflectorオブジェクトのgetConstants()メソッドを呼び出すと、Productクラスに定義されているすべての定数とその値が連想配列として取得され、print_r関数によって出力されます。これにより、プログラムの実行中にクラスの定義情報を動的に調べることが可能になります。

get_class()関数は、オブジェクトのインスタンスからクラス名を文字列として取得します。引数をnullにすると、現在のスコープでクラス名を取得しようとしますが、通常はオブジェクトを渡すのが確実です。クラス定数を動的に取得するには、この取得したクラス名(文字列)を利用して、ReflectionClassという特別なクラスをインスタンス化する必要があります。ReflectionClassは、プログラム実行中にクラスの構造を詳細に調べるための強力な機能です。存在しないクラス名をReflectionClassに渡すとエラーになるため、注意が必要です。この方法は、クラスの定義を変更せずに定数の情報を取得したい場合に役立ちます。

get_classで現在のクラス名を取得する

<?php

/**
 * get_class() 関数を使用して、現在のクラスの名前を取得するサンプルコードです。
 *
 * get_class() を引数なしで呼び出すと、その関数が呼び出されたスコープのクラス名が返されます。
 * これは、現在のメソッドがどのクラスに属しているかを知りたい場合に便利です。
 */
class ExampleClass
{
    /**
     * このメソッドが所属するクラスの名前を取得して返します。
     *
     * @return string 現在のクラス名
     */
    public function getCurrentClassName(): string
    {
        // get_class() を引数なしで呼び出すと、このメソッドが属するクラスの名前を返します。
        return get_class();
    }
}

// ExampleClass のインスタンスを作成します。
$instance = new ExampleClass();

// インスタンスのメソッドを呼び出し、現在のクラス名を取得して出力します。
echo "取得されたクラス名: " . $instance->getCurrentClassName() . PHP_EOL;

// 参考: オブジェクトを引数として渡した場合、そのオブジェクトのクラス名が取得されます。
// echo "オブジェクトのクラス名: " . get_class($instance) . PHP_EOL;

?>

get_class関数は、指定されたオブジェクトのクラス名、または引数を省略した場合は現在のスコープのクラス名を取得するために使用するPHPの内部関数です。

この関数は、?object $object = nullという引数を持ち、常にstring型のクラス名を返します。引数$objectはオプションで、オブジェクトを渡さない場合はnullがデフォルト値として扱われます。

サンプルコードでは、ExampleClassというクラス内に定義されたgetCurrentClassNameメソッドから、引数なしでget_class()を呼び出しています。このように引数を省略して呼び出すと、その関数が実行されている「現在のクラス」の名前、つまりExampleClassという文字列が戻り値として返されます。これにより、メソッド自身がどのクラスに属しているのかを簡単に確認できます。

一方、もしget_class()にオブジェクトのインスタンス、例えばget_class($instance)のように$instanceを引数として渡した場合は、そのインスタンスが属するクラス名(この場合はやはりExampleClass)が返されます。この機能は、特定のオブジェクトのクラス情報を動的に知りたい場合に役立ちます。どちらの場合も、戻り値は常にクラス名を文字列で表現したものです。

get_class()を引数なしで使う場合、必ずクラスのメソッド内で呼び出してください。クラスの外で実行すると、エラーになったり予期せぬ結果になったりする点に注意が必要です。この関数は、現在実行中のメソッドがどのクラスに属しているかを知りたいときに大変便利です。また、オブジェクトを引数として渡せば、そのオブジェクトのクラス名を取得することも可能です。リファレンス情報では戻り値がstringと記載されていますが、特定の状況下(例えば、クラス外での引数なしの呼び出し)ではfalseが返される場合もありますので、戻り値の型には注意してください。

PHP: get_class_varsでクラスの公開プロパティを取得する

<?php

/**
 * サンプルクラスを定義します。
 */
class Product
{
    /**
     * @var string 商品名
     */
    public $name = 'Default Product';

    /**
     * @var float 商品価格
     */
    protected $price = 0.0; // protected プロパティは get_class_vars に含まれません

    /**
     * @var int 商品ID
     */
    private $id = 1; // private プロパティも get_class_vars に含まれません

    /**
     * @var string 商品コード (静的プロパティも get_class_vars には含まれません)
     */
    public static $code = 'PROD001';

    /**
     * コンストラクタ
     *
     * @param string $name
     * @param float $price
     */
    public function __construct(string $name, float $price)
    {
        $this->name = $name;
        $this->price = $price;
    }
}

/**
 * Product クラスのインスタンスを作成します。
 */
$product = new Product('Laptop', 1200.00);

/**
 * オブジェクトからクラス名を取得します。
 * get_class 関数は、指定されたオブジェクトのクラス名を文字列で返します。
 */
$className = get_class($product);
echo "オブジェクトのクラス名: " . $className . PHP_EOL;

/**
 * 取得したクラス名を使用して、そのクラスのデフォルトの公開プロパティを取得します。
 * get_class_vars 関数は、指定されたクラスのデフォルトの公開プロパティを連想配列として返します。
 * protected および private プロパティ、静的プロパティは含まれません。
 */
$classVars = get_class_vars($className);

echo "クラス '" . $className . "' のデフォルトプロパティ:" . PHP_EOL;
foreach ($classVars as $varName => $defaultValue) {
    echo "- " . $varName . ": " . $defaultValue . PHP_EOL;
}

// get_class_vars はオブジェクトを直接引数に取ることもできます
// $classVarsFromObject = get_class_vars($product);
// var_dump($classVarsFromObject);

?>

PHPでは、クラスから作成された「オブジェクト」を操作します。get_class関数は、指定されたオブジェクトがどのクラスから作られたものか、そのクラス名を文字列として取得するために使用されます。引数にはクラス名を知りたいオブジェクトを渡します。戻り値はクラス名を表す文字列です。この機能により、プログラムの実行中にオブジェクトの型を動的に確認できます。

一方、get_class_vars関数は、指定されたクラスが持つ「公開(public)」アクセス可能なプロパティの定義情報とそのデフォルト値を連想配列として取得します。この関数にクラス名(文字列)またはオブジェクトを渡すと、そのクラスに定義されている公開プロパティ名と、初期値が設定されていればその値が返されます。ただし、アクセス修飾子がprotectedprivateのプロパティ、あるいはstaticなプロパティは対象外となり、取得できません。主に、クラスの公開プロパティの構造を調べたい場合に利用されます。

サンプルコードでは、まずProductクラスのオブジェクトを作成し、get_class関数でそのクラス名を取得しています。次に、取得したクラス名をget_class_vars関数に渡し、Productクラスの公開プロパティであるnameのデフォルト値を取得・表示しています。このように、両関数を組み合わせることで、オブジェクトやクラスの情報を動的に探ることができます。

get_class関数は、与えられたオブジェクトのクラス名を正確に文字列で取得できます。この関数自体はシンプルですが、get_class_vars関数と組み合わせて利用する際には注意が必要です。get_class_varsは、指定されたクラスのpublic(公開)なプロパティのデフォルト値のみを連想配列として返します。protectedprivateといったアクセス修飾子を持つプロパティや、static(静的)なプロパティは結果に含まれません。これはオブジェクト指向における情報隠蔽の原則によるものです。また、オブジェクトの現在のプロパティ値ではなく、クラス定義時に設定されたデフォルト値が取得される点を理解し、安全なコード利用を心がけてください。

【PHP8.x】get_class関数の使い方 | いっしー@Webエンジニア