《PHP8上級試験対策》ReflectionClass::getProperties()でクラスのプロパティを正しく取得する方法

  • URLをコピーしました!

はじめに

PHP8上級試験でよく出題されるReflectionClassの問題。特にプロパティの取得で、privateprotectedが取得されるかどうかは混乱しやすいポイントです。本記事ではReflectionClass::getProperties()の正しい挙動と、アクセス修飾子によるフィルタリング方法を、図解つきでわかりやすく解説します。

キーワード: ReflectionClass / getProperties / ReflectionProperty / プロパティ取得 / アクセス修飾子 /

目次

getProperties()の基本

$robj = new ReflectionClass(Hoge::class);
foreach($robj->getProperties() as $v){
    var_dump($v->name);
}
  • $filterを指定しない場合、private/protected/public すべてのプロパティが取得可能
  • PHPマニュアルでは「アクセス可能な範囲のみ」と書かれている箇所がありますが、Reflectionを通して全プロパティ情報は取得できます

Hogeクラスの例

class Hoge {
    private int $pri_num;
    protected int $pro_num;
    public int $pub_num;
}
  • private: pri_num
  • protected: pro_num
  • public: pub_num

デフォルト取得結果

$robj = new ReflectionClass(Hoge::class);
foreach ($robj->getProperties() as $prop) {
    var_dump($prop->getName());
}

出力

string(7) "pri_num"
string(7) "pro_num"
string(7) "pub_num"
  • デフォルトでは全てのプロパティが取得可能です
  • もし出力から pri_num が抜けている場合は誤りです

フィルタリングして特定のアクセス修飾子だけ取得

$props = $robj->getProperties(ReflectionProperty::IS_PUBLIC | ReflectionProperty::IS_PROTECTED);
foreach ($props as $prop) {
    var_dump($prop->getName());
}

出力

string(7) "pro_num"
string(7) "pub_num"

👉️このようにフィルタを使うことで、必要なプロパティだけ取得できます。

図解(ASCIIアート風)

Hogeクラス
+------------------+
| private pri_num  |
| protected pro_num|
| public pub_num   |
+------------------+

getProperties()(filterなし)
=> pri_num, pro_num, pub_num

getProperties(IS_PUBLIC | IS_PROTECTED)
=> pro_num, pub_num

まとめ

  • ReflectionClass::getProperties()デフォルトで全プロパティを取得可能
  • privateも取得されるため、出力例から抜けている場合は間違い
  • アクセス修飾子でフィルターして取得することもできる

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

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