foreach 変更
1. foreach() ループは、配列の内部ポインターに対して機能しなくなりました。
$array = [0, 1, 2]; foreach ($array as &$val) { var_dump(current($array)); }PHP7 は結果として int(0) を 3 回出力します。これは、配列の内部ポインタが変更されていないことを意味します。
前の操作の結果は、int(1)、int(2)、および bool(false) を出力します。
2. 値に従ってループする場合、foreach は配列のコピー操作です
foreach が値 (値ごと) でループする場合、foreach は配列のコピーを操作します。この方法では、ループ中に配列を変更しても、ループの動作には影響しません。 $array = [0, 1, 2]; $ref =& $array; // Necessary to trigger the old behavior foreach ($array as $val) { var_dump($val); unset($array[1]); }上記のコードはループ内の配列の 2 番目の要素の設定を解除しますが、PHP7 は引き続き 3 つの要素を出力します: (0 1 2)
以前のバージョンの PHP では、 1 をスキップし、(0 2) のみを出力します。 .
3. 参照に従ってループする場合、配列への変更はループに影響します。
ループ時に参照を使用する場合、配列への変更はループの動作に影響します。ただし、PHP7 バージョンでは、多くのシナリオで場所のメンテナンスが最適化されます。たとえば、ループ中に要素を配列に追加します。
$array = [0]; foreach ($array as &$val) { var_dump($val); $array[1] = 1; }
上記のコードに追加された要素もループに参加するため、PHP7 では「int(0) int(1)」が出力され、古いバージョンでは「int(0)」のみが出力されます。
4. 単純なオブジェクトをプレーンにループします (走査不可能)。
単純なオブジェクトのループは、値によるループでも参照によるループでも、配列内の参照によるループと同じように動作します。ただし、位置管理はより正確になります。
5. Traversable オブジェクトのオブジェクトの動作は以前と同じです。
編集者注: 上記の stackoverflow の説明: Traversable オブジェクトは、Iterator または IteratorAggregate インターフェイスを実装するオブジェクトです。オブジェクトが iterator または IteratorAggregate インターフェイスを実装している場合、それを iterator オブジェクトと呼ぶことができます。