はじめに
PHP8上級試験でよく出題されるReflectionClassの問題。特にプロパティの取得で、private
やprotected
が取得されるかどうかは混乱しやすいポイントです。本記事ではReflectionClass::getProperties()
の正しい挙動と、アクセス修飾子によるフィルタリング方法を、図解つきでわかりやすく解説します。
目次
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
も取得されるため、出力例から抜けている場合は間違い- アクセス修飾子でフィルターして取得することもできる