《PHP8上級試験対策》オブジェクトをforeachで反復すると「publicプロパティだけ」が対象になる

  • URLをコピーしました!

はじめに

PHPでは、配列だけでなくオブジェクトも foreach で反復処理できます。
ただし、その対象は クラスに定義されたすべてのプロパティではなく、アクセス権のある public プロパティに限定される という点に注意が必要です。

この記事では、PHP8上級試験で問われやすい「オブジェクトをforeachで回したときの挙動」について整理します。

キーワード:オブジェクト反復 / foreach / アクセス修飾子 / public / private

目次

サンプルコード

<?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 プロパティだけ」 です。

補足:すべてのプロパティを反復したい場合

  • IteratorAggregateIterator を実装すれば、制御可能
  • __get() / __set() を使って仮想的にアクセス範囲を広げる方法もある

まとめ

  • foreach でオブジェクトを反復すると public プロパティのみ が対象
  • private / protected プロパティはそのままでは反復されない
  • 試験対策ポイント:foreachとアクセス修飾子の関係を押さえること
  • 試験で出題された場合は「publicだけ」というキーワードで即答できるようにしておく

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

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