Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【PHP8.x】ReflectionObject::getProperties()メソッドの使い方

getPropertiesメソッドの使い方について、初心者にもわかりやすく解説します。

作成日: 更新日:

基本的な使い方

getPropertiesメソッドは、ReflectionObjectによって表現されるオブジェクトが持つすべてのプロパティ、または指定された条件に合致するプロパティに関する情報を取得するメソッドです。このメソッドは、実行時にオブジェクトの内部構造、具体的にはそのオブジェクトがどのようなメンバ変数(プロパティ)を持っているかを動的に調べたい場合に非常に役立ちます。

このメソッドを実行すると、取得された各プロパティについての詳細な情報を提供するReflectionPropertyオブジェクトの配列が返されます。各ReflectionPropertyオブジェクトからは、プロパティ名、宣言されたクラス、値の取得・設定といった操作が可能になります。

オプションとして、引数にフィルターフラグを指定することができます。これにより、public、protected、privateといった可視性を持つプロパティや、staticプロパティなど、特定の条件に合致するプロパティのみを抽出して取得することが可能です。例えば、ReflectionProperty::IS_PUBLICを指定すれば、publicなプロパティだけを対象とすることができます。

システム開発においては、フレームワークやライブラリの実装、あるいはオブジェクト指向設計における高度な情報操作を行う際に、オブジェクトの構造を柔軟に解析し、動的な処理を実現するために利用されます。

構文(syntax)

1<?php
2
3class MyObject {
4    public $publicProperty;
5    protected $protectedProperty;
6    private $privateProperty;
7}
8
9$object = new MyObject();
10$reflection = new ReflectionObject($object);
11
12$properties = $reflection->getProperties();

引数(parameters)

?int $filter = null

  • ?int $filter = null: 取得するプロパティのフィルタを指定します。省略した場合、またはnullの場合は、すべてのアクセスレベル(public, protected, private)のプロパティが取得されます。

戻り値(return)

array

ReflectionObject::getPropertiesは、そのオブジェクトが持つプロパティのReflectionPropertyオブジェクトを格納した配列を返します。

サンプルコード

PHP ReflectionObject::getPropertiesでプロパティ一覧を取得する

1<?php
2
3/**
4 * リフレクションAPIを使用して、オブジェクトのプロパティ情報を表示する関数。
5 * システムエンジニアを目指す初心者向けに、ReflectionObject::getProperties() の基本的な使い方を示します。
6 * PHPの推奨コーディングスタイルに従い、単一の関数として完結させています。
7 */
8function demonstrateReflectionGetPropertiesExample(): void
9{
10    // 1. リフレクションの対象となるサンプルクラスを定義します。
11    //    異なるアクセス修飾子を持つプロパティを含めることで、リフレクションの挙動を理解しやすくします。
12    class MyReflectedClass
13    {
14        public string $publicProperty = 'This is a public property value.';
15        protected int $protectedCount = 100;
16        private bool $privateFlag = true;
17        public static string $staticMessage = 'This is a static public message.';
18    }
19
20    // 2. サンプルクラスのインスタンスを作成します。
21    //    ReflectionObject はクラス名ではなく、オブジェクトインスタンスを引数にとります。
22    $myObject = new MyReflectedClass();
23
24    echo "--- ReflectionObject::getProperties() の使用例 ---\n";
25    echo "対象オブジェクトのクラス名: " . get_class($myObject) . "\n\n";
26
27    // プロパティのアクセス修飾子を判定し、表示するためのヘルパークロージャを定義します。
28    $getAccessModifier = function (ReflectionProperty $p): string {
29        if ($p->isPublic()) {
30            return 'public';
31        } elseif ($p->isProtected()) {
32            return 'protected';
33        } elseif ($p->isPrivate()) {
34            return 'private';
35        }
36        return 'unknown';
37    };
38
39    try {
40        // 3. ReflectionObject のインスタンスを作成します。
41        //    これにより、指定されたオブジェクトに関する情報(プロパティ、メソッドなど)にアクセスできるようになります。
42        $reflector = new ReflectionObject($myObject);
43
44        // --- 全てのプロパティを取得 (引数なし) ---
45        echo "=== 全てのプロパティ (引数なし) ===\n";
46        // 4. getProperties() メソッドを引数なしで呼び出すと、
47        //    public, protected, private な全てのプロパティ (静的プロパティも含む) が ReflectionProperty オブジェクトの配列として返されます。
48        $allProperties = $reflector->getProperties();
49
50        if (empty($allProperties)) {
51            echo "  このオブジェクトにはプロパティが見つかりませんでした。\n";
52        } else {
53            foreach ($allProperties as $property) {
54                echo "  - 名前: '" . $property->getName() . "'";
55                echo ", アクセス修飾子: " . $getAccessModifier($property);
56                if ($property->isStatic()) {
57                    echo " (static)";
58                }
59                echo "\n";
60            }
61        }
62
63        // --- 特定のフィルターを使ったプロパティの取得例 ---
64        echo "\n=== public プロパティのみ取得 (ReflectionProperty::IS_PUBLIC) ===\n";
65        // 5. 引数にフィルター定数を指定することで、特定の種類のプロパティのみを取得できます。
66        //    ReflectionProperty::IS_PUBLIC は public なプロパティのみを対象とします。
67        $publicProperties = $reflector->getProperties(ReflectionProperty::IS_PUBLIC);
68
69        if (empty($publicProperties)) {
70            echo "  public プロパティが見つかりませんでした。\n";
71        } else {
72            foreach ($publicProperties as $property) {
73                echo "  - 名前: '" . $property->getName() . "'";
74                echo ", アクセス修飾子: " . $getAccessModifier($property);
75                if ($property->isStatic()) {
76                    echo " (static)";
77                }
78                echo "\n";
79            }
80        }
81
82        echo "\n=== protected プロパティのみ取得 (ReflectionProperty::IS_PROTECTED) ===\n";
83        // 同様に protected プロパティのフィルター例です。
84        $protectedProperties = $reflector->getProperties(ReflectionProperty::IS_PROTECTED);
85
86        if (empty($protectedProperties)) {
87            echo "  protected プロパティが見つかりませんでした。\n";
88        } else {
89            foreach ($protectedProperties as $property) {
90                echo "  - 名前: '" . $property->getName() . "'";
91                echo ", アクセス修飾子: " . $getAccessModifier($property);
92                if ($property->isStatic()) {
93                    echo " (static)";
94                }
95                echo "\n";
96            }
97        }
98
99        echo "\n=== public かつ static なプロパティを取得 (ReflectionProperty::IS_PUBLIC | ReflectionProperty::IS_STATIC) ===\n";
100        // 複数のフィルターを組み合わせることも可能です。
101        // 論理和 (OR) を使うことで、複数のフラグを指定できます。
102        $publicStaticProperties = $reflector->getProperties(ReflectionProperty::IS_PUBLIC | ReflectionProperty::IS_STATIC);
103
104        if (empty($publicStaticProperties)) {
105            echo "  public かつ static なプロパティが見つかりませんでした。\n";
106        } else {
107            foreach ($publicStaticProperties as $property) {
108                echo "  - 名前: '" . $property->getName() . "'";
109                echo ", アクセス修飾子: " . $getAccessModifier($property);
110                if ($property->isStatic()) {
111                    echo " (static)";
112                }
113                echo "\n";
114            }
115        }
116
117    } catch (ReflectionException $e) {
118        // リフレクション処理中にエラーが発生した場合のハンドリング
119        echo "リフレクションエラーが発生しました: " . $e->getMessage() . "\n";
120    }
121}
122
123// サンプルコードを実行します。
124demonstrateReflectionGetPropertiesExample();
125
126?>

PHP 8のReflectionObject::getProperties()メソッドは、プログラム実行時にオブジェクトが持つプロパティ(変数)に関する詳細な情報を取得する機能を提供します。これは「リフレクションAPI」と呼ばれる仕組みの一部で、オブジェクトの内部構造を動的に調べたい場合に非常に役立ちます。

このメソッドは、オプションで$filterという整数型の引数を受け取ります。この引数にはReflectionPropertyクラスが定義する定数(例: ReflectionProperty::IS_PUBLICReflectionProperty::IS_PROTECTEDReflectionProperty::IS_STATICなど)を指定でき、これにより取得するプロパティを特定のアクセス修飾子や静的プロパティに絞り込むことが可能です。複数の定数を|(ビット論理和)で組み合わせることで、より複雑な条件でプロパティを選択できます。引数を省略した場合やnullを指定した場合は、全てのプロパティが取得対象となります。

getProperties()の戻り値は、ReflectionPropertyオブジェクトの配列です。それぞれのReflectionPropertyオブジェクトは、プロパティ名、アクセス修飾子、静的であるかどうかの情報など、個々のプロパティに関する詳細な情報を持っています。

サンプルコードでは、MyReflectedClassというクラスのインスタンスをReflectionObjectに渡し、getProperties()を使ってプロパティ情報を取得しています。引数なしで全てのプロパティを取得する例に加え、ReflectionProperty::IS_PUBLICReflectionProperty::IS_PUBLIC | ReflectionProperty::IS_STATICといったフィルター定数を指定し、publicプロパティやpublicかつstaticなプロパティのみを抽出する方法を示しています。これにより、オブジェクトのプロパティを柔軟に検査し、プログラムの動的な挙動を理解したり、フレームワーク開発に応用したりすることが可能になります。

ReflectionObject::getProperties()は、オブジェクトのプロパティ情報を取得する際に使われる機能です。このメソッドは、クラス名ではなくオブジェクトのインスタンスを基にプロパティを調べます。引数を指定しない場合、publicprotectedprivateの全プロパティ(静的プロパティも含む)が取得されます。特定のアクセスレベルのプロパティだけが必要な場合は、ReflectionPropertyクラスの定数(例: ReflectionProperty::IS_PUBLIC)を引数に指定します。複数の条件を組み合わせる際は、|(論理和)演算子を使用してください。戻り値はReflectionPropertyオブジェクトの配列となり、それぞれのプロパティの詳細情報にアクセスできます。これは高度なAPIのため、利用の際には例外処理でエラーに備えることが重要です。

PHP ReflectionObject::getProperties でプロパティを取得する

1<?php
2
3/**
4 * ReflectionObject::getProperties メソッドの使用例を示すクラス。
5 * プロパティのアクセスレベルに応じて、オブジェクトのプロパティ情報を取得し表示します。
6 */
7class Example
8{
9    // public プロパティ
10    public string $publicProperty = 'Hello';
11
12    // protected プロパティ
13    protected int $protectedProperty = 123;
14
15    // private プロパティ
16    private bool $privateProperty = true;
17
18    // 型ヒント付きの public プロパティ (PHP 7.4以降)
19    public ?array $nullableArrayProperty = null;
20
21    /**
22     * オブジェクトのプロパティ情報を取得し、種類別に表示します。
23     */
24    public function demonstrateGetProperties(): void
25    {
26        // 自身のインスタンスを作成し、ReflectionObjectで検査対象とする
27        $reflector = new ReflectionObject($this);
28
29        echo "--- オブジェクトの全プロパティ ---" . PHP_EOL;
30        // getProperties() を引数なしで呼び出すと、全てのプロパティ(public, protected, private)が返される
31        $allProperties = $reflector->getProperties();
32        foreach ($allProperties as $property) {
33            $accessLevel = '';
34            if ($property->isPublic()) {
35                $accessLevel = 'public';
36            } elseif ($property->isProtected()) {
37                $accessLevel = 'protected';
38            } elseif ($property->isPrivate()) {
39                $accessLevel = 'private';
40            }
41            echo sprintf("  - 名前: %s, アクセスレベル: %s%s", $property->getName(), $accessLevel, PHP_EOL);
42        }
43        echo PHP_EOL;
44
45        echo "--- オブジェクトの public プロパティのみ ---" . PHP_EOL;
46        // ReflectionProperty::IS_PUBLIC フィルターを使用して public プロパティのみを取得
47        $publicProperties = $reflector->getProperties(ReflectionProperty::IS_PUBLIC);
48        foreach ($publicProperties as $property) {
49            echo sprintf("  - 名前: %s%s", $property->getName(), PHP_EOL);
50        }
51        echo PHP_EOL;
52
53        echo "--- オブジェクトの protected プロパティのみ ---" . PHP_EOL;
54        // ReflectionProperty::IS_PROTECTED フィルターを使用して protected プロパティのみを取得
55        $protectedProperties = $reflector->getProperties(ReflectionProperty::IS_PROTECTED);
56        foreach ($protectedProperties as $property) {
57            echo sprintf("  - 名前: %s%s", $property->getName(), PHP_EOL);
58        }
59        echo PHP_EOL;
60
61        echo "--- オブジェクトの private プロパティのみ ---" . PHP_EOL;
62        // ReflectionProperty::IS_PRIVATE フィルターを使用して private プロパティのみを取得
63        $privateProperties = $reflector->getProperties(ReflectionProperty::IS_PRIVATE);
64        foreach ($privateProperties as $property) {
65            echo sprintf("  - 名前: %s%s", $property->getName(), PHP_EOL);
66        }
67        echo PHP_EOL;
68
69        echo "--- オブジェクトの protected および private プロパティ ---" . PHP_EOL;
70        // 複数のフィルターを OR で結合して指定することも可能
71        $protectedAndPrivateProperties = $reflector->getProperties(
72            ReflectionProperty::IS_PROTECTED | ReflectionProperty::IS_PRIVATE
73        );
74        foreach ($protectedAndPrivateProperties as $property) {
75            $accessLevel = $property->isProtected() ? 'protected' : 'private';
76            echo sprintf("  - 名前: %s, アクセスレベル: %s%s", $property->getName(), $accessLevel, PHP_EOL);
77        }
78        echo PHP_EOL;
79    }
80}
81
82// サンプルコードを実行
83$example = new Example();
84$example->demonstrateGetProperties();

PHPのReflectionObject::getPropertiesメソッドは、オブジェクトの内部構造を動的に調べる「リフレクション」機能の一部で、指定したオブジェクトが持つプロパティ(メンバ変数)の情報を取得するために使われます。

このメソッドは、オプションで$filterという整数型の引数を受け取ります。この引数には、取得したいプロパティの種類をReflectionPropertyクラスの定数(例: ReflectionProperty::IS_PUBLICReflectionProperty::IS_PROTECTEDReflectionProperty::IS_PRIVATE)を使って指定します。これらの定数はビットOR演算子(|)で複数組み合わせて、特定のアクセスレベルのプロパティをまとめて取得することも可能です。引数を省略するかnullを指定した場合、そのオブジェクトのpublic、protected、privateの全てのプロパティが返されます。

戻り値は、取得条件に合致するプロパティ一つ一つを表現するReflectionPropertyオブジェクトの配列です。各ReflectionPropertyオブジェクトからは、プロパティの名前、アクセスレベル、型などの詳細情報をプログラムから取得できます。

サンプルコードでは、Exampleクラスのインスタンスに対してReflectionObjectを作成し、getPropertiesメソッドを引数なしで呼び出して全プロパティを取得する例や、特定のフィルター定数(IS_PUBLICなど)を指定してpublic、protected、privateの各プロパティのみを抽出する具体的な方法、さらには複数のフィルターを組み合わせて取得する方法を示しています。これにより、オブジェクトのプロパティ情報を柔軟に取得し、活用できることがわかります。

このメソッドは、PHPの実行時にクラスのプロパティ情報を動的に調べるための機能です。引数を指定しない場合、public、protected、privateを含む全てのプロパティが取得されます。特定のアクセスレベルのプロパティのみを取得したい場合は、ReflectionProperty::IS_PUBLICなどの定数を引数に指定します。複数の種類をまとめて取得したい場合は、|(ビット論理和)演算子でこれらの定数を組み合わせてください。戻り値はReflectionPropertyオブジェクトの配列で、各プロパティの名前やアクセスレベルなどの詳細情報を取り出せます。ただし、privateやprotectedなプロパティの情報取得は、オブジェクト指向のカプセル化の原則に反する場合があるため、利用は慎重に行う必要があります。

関連コンテンツ

【PHP8.x】ReflectionObject::getProperties()メソッドの使い方 | いっしー@Webエンジニア