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

作成日: 更新日:

get_object_vars関数は、指定されたオブジェクトが持つすべてのインスタンスプロパティを連想配列として取得する関数です。この関数は、PHPのオブジェクト指向プログラミングにおいて、オブジェクトの内部状態を動的に検査したり、操作したりする際に非常に有用です。

具体的には、引数として一つのオブジェクトを受け取ります。そして、そのオブジェクトに定義されているすべてのインスタンスプロパティを、連想配列の形式で返します。戻り値となる連想配列では、プロパティの名前がキーとして使用され、そのプロパティに現在格納されている値が、対応する要素の値となります。

この関数は、publicprotectedprivateといったアクセス修飾子に関わらず、すべてのインスタンスプロパティを取得します。ただし、staticプロパティ(クラス自体に属するプロパティ)は対象外となりますのでご注意ください。

主に、オブジェクトのデバッグ時や、オブジェクトの全プロパティを他のデータ構造(例えばJSONデータ)に変換する前処理として利用されます。システムエンジニアを目指す初心者の方にとっては、オブジェクトがどのようなデータを保持しているかをプログラムから確認する第一歩として、この関数を理解しておくことはオブジェクト指向の理解を深める上で役立つでしょう。オブジェクトの状態を一覧で把握し、プログラムの振る舞いを分析する際に活用できます。

基本的な使い方

構文(syntax)

<?php

class Product
{
    public $id;
    public $name;
    public $price;
    protected $internal_code; // protectedプロパティは取得されません

    public function __construct($id, $name, $price)
    {
        $this->id = $id;
        $this->name = $name;
        $this->price = $price;
        $this->internal_code = uniqid();
    }
}

$product = new Product(101, 'Smartphone', 599.99);

// オブジェクトのアクセス可能なプロパティを連想配列として取得
$object_properties = get_object_vars($product);

print_r($object_properties);

?>

引数(parameters)

object $object

  • object $object: プロパティを取得したいオブジェクトを指定します

戻り値(return)

array

指定されたオブジェクトのプロパティとその値を連想配列として返します。

サンプルコード

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

<?php

/**
 * 親クラスを定義します。
 * 各アクセス修飾子を持つプロパティを含みます。
 */
class ParentClass
{
    public string $parentPublicProperty = '親クラスの公開プロパティ';
    protected string $parentProtectedProperty = '親クラスの保護プロパティ';
    private string $parentPrivateProperty = '親クラスの非公開プロパティ';
}

/**
 * ParentClass を継承する子クラスを定義します。
 * 子クラス独自のプロパティも持ちます。
 */
class ChildClass extends ParentClass
{
    public string $childPublicProperty = '子クラスの公開プロパティ';
    protected string $childProtectedProperty = '子クラスの保護プロパティ';
    private string $childPrivateProperty = '子クラスの非公開プロパティ';
}

// ChildClass のオブジェクトを作成します。
$childObject = new ChildClass();

// get_object_vars() 関数を使用して、オブジェクトの公開プロパティをすべて取得します。
// この関数は、指定されたオブジェクトが持つ「公開 (public)」なプロパティのみを
// 連想配列として返します。
// 親クラスから継承された公開プロパティも含まれますが、
// protected や private なプロパティは結果に含まれません。
$properties = get_object_vars($childObject);

// 取得したプロパティ配列の内容を表示します。
// 結果には 'parentPublicProperty' と 'childPublicProperty' のみが含まれていることがわかります。
print_r($properties);

?>

PHPのget_object_vars関数は、指定されたオブジェクトが持つ「公開 (public)」なプロパティをすべて取得するための関数です。この関数は引数としてobject型のオブジェクトを受け取り、プロパティ名とその値のペアを要素とする連想配列をarray型で返します。

提供されたサンプルコードでは、ParentClassとその子クラスであるChildClassが定義されており、それぞれに公開、保護、非公開のプロパティが含まれています。ChildClassのオブジェクトを作成し、get_object_vars関数に渡すことで、そのオブジェクトのプロパティを取得しています。

重要な点として、get_object_varsは、たとえ継承関係にあるクラスのオブジェクトであっても、そのオブジェクトから直接アクセス可能な「公開 (public)」なプロパティのみを返します。親クラスから継承された公開プロパティも結果に含まれますが、protected(保護された)やprivate(非公開の)プロパティは、この関数では取得されません。したがって、サンプルコードの実行結果には、parentPublicPropertychildPublicPropertyのみが含まれることが確認できます。この関数は、オブジェクトの外部から参照可能な情報のみを抽出したい場合に特に役立ちます。

get_object_vars関数は、指定したオブジェクトの公開(public)プロパティのみを連想配列で取得します。そのため、保護(protected)や非公開(private)のプロパティは、この関数では取得できませんので注意が必要です。継承関係にある子クラスのオブジェクトに対して実行した場合、親クラスから継承された公開プロパティも結果に含まれます。この関数は、主にオブジェクトの外部からアクセス可能なプロパティとその値を確認する際に利用してください。オブジェクトの内部状態全てを参照する目的には適していませんので、取得したい情報とプロパティのアクセス修飾子を正しく理解して使用しましょう。

get_object_vars で空配列を取得する

<?php

// get_object_vars 関数は、オブジェクトが持つ 'public' なプロパティのみを連想配列として返します。
// 'protected' や 'private' なプロパティは含まれません。
// そのため、もしオブジェクトに public なプロパティが一つもなければ、この関数は空の配列を返します。

/**
 * このクラスは private および protected なプロパティのみを持ち、
 * public なプロパティは一切持ちません。
 */
class ConfigurationStore
{
    private string $databasePassword = 'super_secret_password_123';
    protected array $internalSettings = [
        'debugMode' => false,
        'logLevel' => 'info'
    ];

    public function __construct(string $dbPass)
    {
        $this->databasePassword = $dbPass;
    }

    // public なプロパティは定義されていません。
}

// ConfigurationStore クラスのインスタンスを作成します。
$config = new ConfigurationStore('my_secure_db_pass');

// get_object_vars 関数を使用して、インスタンスの public プロパティを取得します。
// ConfigurationStore クラスには public なプロパティがないため、空の配列が返されるはずです。
$properties = get_object_vars($config);

echo "ConfigurationStore インスタンスの public プロパティ:\n";
var_dump($properties);

// 結果が空の配列であることを確認し、その理由を説明します。
if (empty($properties)) {
    echo "\nget_object_vars 関数は、ConfigurationStore オブジェクトに public なプロパティがないため、空の配列を返しました。\n";
}

PHPのget_object_vars関数は、指定されたオブジェクトが持つすべてのpublicなプロパティを連想配列として取得する際に使用します。引数には取得対象のobject(オブジェクトインスタンス)を指定し、戻り値はプロパティ名がキー、その値がバリューとなるarray(連想配列)です。この関数は、privateprotectedなプロパティは戻り値の配列には含まれません。

上記のサンプルコードでは、ConfigurationStoreというクラスが定義されています。このクラスはprivate$databasePasswordprotected$internalSettingsというプロパティを持ちますが、publicなプロパティは一切持っていません。

そのため、ConfigurationStoreクラスのインスタンスを作成し、それをget_object_vars関数に渡してプロパティを取得しようとすると、結果は空の配列となります。これは、get_object_vars関数が参照できるpublicなプロパティがオブジェクト内に存在しないためです。このように、この関数はpublicなプロパティのみを対象とするため、もしオブジェクトにpublicプロパティが一つもなければ、空の配列が返されるという挙動を理解しておくことが重要です。

get_object_vars関数は、対象オブジェクトが持つpublicなプロパティのみを連想配列として返します。privateprotectedなプロパティは結果に含まれないため、オブジェクトにpublicプロパティが一つも定義されていない場合は空の配列が返されます。初心者がこの関数を使用する際には、返されるのがpublicプロパティに限定される点を特に注意してください。もしオブジェクトのすべてのプロパティや、privateprotectedプロパティにアクセスする必要がある場合は、PHPのリフレクションAPIを用いる方法を検討してください。予期せぬ空の配列を受け取った際は、対象オブジェクトにpublicプロパティが定義されているかをまず確認しましょう。

get_object_varsとarrayキャストの比較

<?php

/**
 * オブジェクトのプロパティの可視性と、
 * get_object_vars() および (array) キャストの挙動を比較するサンプルコード。
 */
class PropertyVisibilityExample
{
    public string $publicProperty = "これは公開プロパティです。";
    protected string $protectedProperty = "これは保護プロパティです。";
    private string $privateProperty = "これは非公開プロパティです。";

    // コンストラクタはプロパティの初期化のみのため、特に処理は記述しません。
    public function __construct()
    {
        // プロパティは宣言時にデフォルト値で初期化されます。
    }
}

// クラスのインスタンスを作成します。
$object = new PropertyVisibilityExample();

echo "--- get_object_vars() の結果 ---" . PHP_EOL;
// get_object_vars() は、オブジェクトの外部からアクセス可能な (public) プロパティのみを
// 連想配列として返します。protected や private プロパティは含まれません。
$vars = get_object_vars($object);
print_r($vars);
echo PHP_EOL;

echo "--- (array) キャストの結果 ---" . PHP_EOL;
// オブジェクトを (array) にキャストすると、オブジェクトの全てのプロパティが配列に含まれます。
// ただし、protected プロパティのキーには '\0*\0' が、
// private プロパティのキーには '\0ClassName\0' (ClassNameはクラス名) がプレフィックスとして付加されます。
$castedArray = (array) $object;
print_r($castedArray);
echo PHP_EOL;

echo "--- 結果のまとめ ---" . PHP_EOL;
echo "get_object_vars():" . PHP_EOL;
echo "  - オブジェクトのpublicプロパティのみを返します。" . PHP_EOL;
echo "  - キーはプロパティ名そのままです。" . PHP_EOL;
echo "(array) キャスト:" . PHP_EOL;
echo "  - オブジェクトのpublic, protected, private全てのプロパティを返します。" . PHP_EOL;
echo "  - protected/privateプロパティのキーには、特別な形式のプレフィックスが付与されます。" . PHP_EOL;

?>

get_object_vars関数は、PHP 8.4.12でオブジェクトのpublicなプロパティを連想配列として取得するために使用します。引数にはオブジェクト$objectを指定します。戻り値は配列で、オブジェクトのpublicプロパティ名がキー、プロパティの値が値となります。

このサンプルコードでは、get_object_vars(array)キャストの挙動の違いを比較します。PropertyVisibilityExampleクラスは、public、protected、privateの異なる可視性を持つプロパティを定義しています。

get_object_vars($object)は、$objectのpublicプロパティ($publicProperty)のみを含む連想配列を返します。protectedやprivateプロパティは結果に含まれません。

一方、(array) $objectは、オブジェクトの全てのプロパティを配列として返します。ただし、protectedプロパティのキーには\0*\0が、privateプロパティのキーには\0ClassName\0(ClassNameはクラス名)がプレフィックスとして付加されます。これにより、protectedやprivateプロパティを区別できます。

get_object_varsはpublicプロパティのみを扱い、キーはプロパティ名そのままです。(array)キャストは全てのプロパティを返しますが、protected/privateプロパティのキーには特別なプレフィックスが付与されます。どちらの方法を使用するかは、必要なプロパティの種類や、アクセス制御の要件によって選択します。

get_object_vars()はオブジェクトのpublicプロパティのみを連想配列として取得し、protectedprivateプロパティは含まれません。対照的に、オブジェクトを(array)にキャストすると、publicprotectedprivate全てのプロパティが配列に含まれますが、protectedprivateプロパティのキーには特別な形式のプレフィックスが付与されるため、直接アクセスする際は注意が必要です。一般的に、オブジェクトの内部状態にアクセスする場合は、オブジェクトに定義されたpublicメソッド(ゲッターなど)を利用することが推奨されます。get_object_vars()はオブジェクトのpublicな状態をまとめて取得する際に有用ですが、(array)キャストによるprotectedprivateプロパティへの直接アクセスは、デバッグなど限定的な用途に留め、通常のプログラミングでは避けるべきです。オブジェクト指向のカプセル化の原則を尊重し、意図しないデータ露出や挙動を防ぐように心がけてください。

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