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

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

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

作成日: 更新日:

基本的な使い方

getStaticPropertiesメソッドは、指定されたクラスの全ての静的プロパティの情報を取得するメソッドです。PHPのリフレクションAPIの一部であるReflectionClassクラスに属しており、プログラムの実行中にクラスの構造や情報を動的に検査するために使用されます。

このメソッドを呼び出すと、ReflectionClassオブジェクトが表すクラスに直接定義されている静的プロパティ、およびその親クラスから継承された静的プロパティが、連想配列として返されます。配列のキーはプロパティの名前、値は現在のプロパティの値となります。これにより、publicprotectedprivateといったアクセス修飾子に関わらず、そのクラスの全ての静的プロパティとその値を実行時に調べることが可能になります。

例えば、フレームワークの開発において、特定のクラスが持つ設定値を動的に読み込んだり、クラスのデバッグ時に静的状態を確認したりする際に非常に役立ちます。また、テストの際に、クラスの内部状態である静的プロパティを検査するといった用途でも利用されます。対象のクラスに静的プロパティが一つも定義されていない場合、このメソッドは空の配列を返します。この機能は、PHP 8を含む様々なバージョンで利用でき、プログラムの柔軟性と拡張性を高めるための強力なツールとなります。

構文(syntax)

1<?php
2
3class MyClass
4{
5    public static $propertyOne = 'Static Value 1';
6    protected static $propertyTwo = 'Static Value 2';
7}
8
9$reflectionClass = new ReflectionClass('MyClass');
10$staticProperties = $reflectionClass->getStaticProperties();

引数(parameters)

引数なし

引数はありません

戻り値(return)

array

ReflectionClass::getStaticPropertiesメソッドは、そのクラスで定義されているすべての静的プロパティの名前と値を連想配列として返します。

サンプルコード

PHP ReflectionClass::getStaticProperties() で静的プロパティを取得する

1<?php
2
3/**
4 * 静的プロパティを持つサンプルクラス。
5 * ReflectionClass::getStaticProperties() メソッドで取得されるプロパティの例を提供します。
6 */
7class MyClass
8{
9    // 公開静的プロパティ
10    public static string $publicStaticProperty = 'Hello Public Static';
11
12    // 保護静的プロパティ(getStaticPropertiesで取得可能)
13    protected static int $protectedStaticProperty = 12345;
14
15    // 非公開静的プロパティ(getStaticPropertiesで取得可能)
16    private static bool $privateStaticProperty = true;
17
18    // 配列型の静的プロパティ
19    public static array $arrayStaticProperty = ['item1', 'item2'];
20}
21
22/**
23 * 指定されたクラスの全ての静的プロパティを取得し、その名前と値を表示します。
24 *
25 * PHPのReflectionClass::getStaticProperties() メソッドの使用例を示します。
26 * このメソッドは、public, protected, private すべてのアクセス修飾子を持つ
27 * 静的プロパティをプロパティ名とその値の連想配列として返します。
28 *
29 * @param string $className プロパティを取得するクラスの完全修飾名。
30 */
31function displayClassStaticProperties(string $className): void
32{
33    try {
34        // ReflectionClassのインスタンスを生成し、クラスの情報を取得します。
35        $reflector = new ReflectionClass($className);
36
37        echo "クラス '{$className}' の静的プロパティ:\n";
38
39        // getStaticProperties() メソッドを使って、クラスの全ての静的プロパティを取得します。
40        $staticProperties = $reflector->getStaticProperties();
41
42        if (empty($staticProperties)) {
43            echo "  静的プロパティは見つかりませんでした。\n";
44        } else {
45            foreach ($staticProperties as $name => $value) {
46                // プロパティの名前とその値を分かりやすい形式で出力します。
47                echo "  プロパティ名: {$name}, 値: " . var_export($value, true) . "\n";
48            }
49        }
50
51    } catch (ReflectionException $e) {
52        // クラスが存在しないなどのエラーが発生した場合に、例外を捕捉します。
53        echo "エラー: クラス '{$className}' のリフレクションに失敗しました - " . $e->getMessage() . "\n";
54    }
55}
56
57// 上記で定義したMyClassの静的プロパティを表示する例を実行します。
58displayClassStaticProperties(MyClass::class);
59

PHPのReflectionClass::getStaticPropertiesメソッドは、指定したクラスの静的プロパティを動的に取得します。これは、実行中にプログラムの構造を検査する「リフレクション」機能の一部です。

利用するには、ReflectionClassのインスタンスを作成し、クラス名を指定します。その後、そのインスタンスから引数なしでgetStaticProperties()メソッドを呼び出します。戻り値は配列で、クラスに定義されているpublicprotectedprivate全ての静的プロパティが、プロパティ名と値の連想配列として返されます。

サンプルコードでは、MyClassの静的プロパティが、displayClassStaticProperties関数内でgetStaticProperties()により取得・表示される様子が示されています。これにより、実行中にクラスの静的プロパティ情報を簡単に調べられます。

ReflectionClass::getStaticProperties()メソッドは、クラスのpublicprotectedprivateの全静的プロパティを、アクセス修飾子に関わらずその値とともに取得できます。これは通常のアクセス制限をバイパスする高度な機能である点にご注意ください。静的ではないインスタンスプロパティは対象外となります。主にフレームワーク開発やライブラリ開発、デバッグなどの特殊な用途で利用され、一般的なビジネスロジックで直接使うことは稀です。指定されたクラスが存在しない場合はReflectionExceptionが発生するため、try-catchで例外を適切に処理することが、コードを安全に運用するために非常に重要です。取得される連想配列のキーはプロパティ名、値は対応するプロパティの値です。

PHP ReflectionClassで静的プロパティを取得する

1<?php
2
3/**
4 * 静的プロパティを持つサンプルクラスです。
5 */
6class ProductConfig
7{
8    /**
9     * 公開静的プロパティ:データベース接続文字列。
10     */
11    public static string $databaseHost = 'localhost';
12
13    /**
14     * 公開静的プロパティ:アプリケーションバージョン。
15     */
16    public static string $appVersion = '1.0.0';
17
18    /**
19     * 保護静的プロパティ:APIキー(リフレクションで値を確認できることを示す)。
20     */
21    protected static string $apiKey = 'your_protected_api_key';
22
23    /**
24     * 非公開静的プロパティ:デバッグモード(リフレクションで値を確認できることを示す)。
25     */
26    private static bool $debugMode = true;
27}
28
29// ReflectionClass を使用して、ProductConfig クラスの情報を取得します。
30// これにより、クラスの内部構造(プロパティ、メソッドなど)にアクセスできるようになります。
31$reflector = new ReflectionClass(ProductConfig::class);
32
33// getStaticProperties() メソッドを呼び出して、ProductConfig クラスが持つ全ての静的プロパティの配列を取得します。
34// このメソッドは、public, protected, private の可視性に関わらず、全ての静的プロパティとその現在の値を返します。
35$staticProperties = $reflector->getStaticProperties();
36
37echo "--- ProductConfig クラスの静的プロパティ ---" . PHP_EOL;
38
39// 取得した静的プロパティをループして、名前と値を出力します。
40foreach ($staticProperties as $name => $value) {
41    // 値が真偽値の場合は、'true' または 'false' として表示します。
42    // その他の型の値はそのまま表示します。
43    $displayValue = is_bool($value) ? ($value ? 'true' : 'false') : $value;
44    echo "プロパティ名: {$name}, 値: {$displayValue}" . PHP_EOL;
45}
46
47// 出力例:
48// --- ProductConfig クラスの静的プロパティ ---
49// プロパティ名: databaseHost, 値: localhost
50// プロパティ名: appVersion, 値: 1.0.0
51// プロパティ名: apiKey, 値: your_protected_api_key
52// プロパティ名: debugMode, 値: true
53

PHP 8のReflectionClass::getStaticPropertiesメソッドは、指定されたクラスが持つ全ての静的プロパティの情報を取得するために使用されます。このメソッドは引数を必要とせず、呼び出すだけで対象クラスの静的プロパティに関する情報を取得できます。戻り値としては、静的プロパティの名前をキーとし、その現在の値を格納した配列が返されます。このメソッドの大きな特徴は、publicprotectedprivateといった可視性に関わらず、クラスに定義されている全ての静的プロパティにアクセスし、その値を取得できる点です。

サンプルコードでは、ProductConfigというクラスが定義されており、公開、保護、非公開の静的プロパティがいくつか含まれています。まず、ReflectionClass(ProductConfig::class)としてProductConfigクラスの情報を扱うためのReflectionClassオブジェクトを作成します。これにより、コード実行時にクラスの内部構造を調べることが可能になります。次に、この$reflectorオブジェクトに対してgetStaticProperties()メソッドを呼び出すことで、ProductConfigクラスが持つ全ての静的プロパティと、それぞれの現在の値が配列として取得されます。最後に、取得した配列をループ処理し、各プロパティの名前と値を画面に出力しています。この結果から、本来アクセスできないはずの保護されたプロパティや非公開のプロパティの値も動的に確認できることがわかります。

サンプルコードが示す通り、getStaticPropertiesはクラスの公開・保護・非公開を問わず、全ての静的プロパティとその現在の値を配列で取得します。この機能は、通常は外部からアクセスできないprotectedprivateなプロパティの値まで読み取れてしまう点が最大の特徴であり、注意点です。特に機密情報(APIキーなど)がprotectedprivateで定義されている場合でも、リフレクションを使えばその値が取得できてしまうため、情報漏洩のリスクを十分に理解して利用してください。リフレクションはクラスの内部構造を詳細に解析する強力な機能ですが、その特性からセキュリティ上のリスクを伴うことがあります。通常のアプリケーション開発では頻繁に利用するものではなく、デバッグやフレームワーク開発といった特殊な用途に限定して使用することが推奨されます。

関連コンテンツ

関連IT用語

関連プログラミング言語