はじめに
PHPでは、配列だけでなくオブジェクトも foreach
で反復処理できます。
ただし、その対象は クラスに定義されたすべてのプロパティではなく、アクセス権のある public プロパティに限定される という点に注意が必要です。
この記事では、PHP8上級試験で問われやすい「オブジェクトをforeachで回したときの挙動」について整理します。
目次
サンプルコード
<?php
declare(strict_types=1);
error_reporting(-1);
class Hoge{
public function __construct(
private int $num, // private(foreachでは見えない)
public string $str, // public(foreachで見える)
){}
}
$obj = new Hoge(1, '2nd');
foreach ($obj as $k => $v) {
echo "{$k}: {$v}\n";
}
実行結果
str: 2nd
ASCIIアート図解
オブジェクトをforeachするときのイメージは以下の通りです。
+-------------------+
| Hoge オブジェクト |
+-------------------+
| - num (private) | <-- foreach からは見えない
| + str (public) | <-- foreach で参照される!
+-------------------+
foreach($obj as $k => $v) の結果
└─> $k = "str"
└─> $v = "2nd"
つまり foreachで反復できるのは「アクセス可能な public プロパティだけ」 です。
補足:すべてのプロパティを反復したい場合
- IteratorAggregate や Iterator を実装すれば、制御可能
__get()
/__set()
を使って仮想的にアクセス範囲を広げる方法もある
まとめ
- foreach でオブジェクトを反復すると public プロパティのみ が対象
- private / protected プロパティはそのままでは反復されない
- 試験対策ポイント:foreachとアクセス修飾子の関係を押さえること
- 試験で出題された場合は「publicだけ」というキーワードで即答できるようにしておく