php / php/php-src

Dereferencing an array in foreach unwraps the reference

オープン
#11,665 コメント 3 件 リアクション 0 件 担当者 0 名 GitHub で見る

まだ誰も着手していません。

Bug Status: Needs Triage
主要言語
C
スター
40.4k
フォーク
8.2k
平均マージ
2日 13時間
マージ済み PR(30日)
96

説明

Description

The following code (https://3v4l.org/8QBeN):

<?php

$a = [1]; 
foreach ((isset($a["key"]) ? [&$a["key"]] : [&$a])[0] as &$v) {
    var_dump($a);
    $v++;
}
var_dump($a);

Resulted in this output:

array(1) {
  [0]=>
  int(1)
}
array(1) {
  [0]=>
  int(1)
}

But I expected this output instead:

array(1) {
  [0]=>
  &int(1)
}
array(1) {
  [0]=>
  &int(2)
}

In PHP 7.2 and before, the output was as expected. Today it's required to use an explicit variable to preserve the reference.

PHP Version

PHP 7.3.0 - master

Operating System

No response

コントリビューションガイド

コントリビューションガイドを開く

はじめの一歩

  1. issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
  2. 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
  3. リポジトリをフォークし、ブランチを切って変更します。
  4. issue 番号を参照したプルリクエストを送ります。

調査の方向性

Issue にリンクされている PHP の再現コードから始め、PHP 7.2 と報告された PHP 7.3 バージョンの動作を比較します。条件付き配列表現を反復処理する際に foreach の参照がどのように扱われるかを調査します。参照が保持され、出力が期待される結果と一致し、明示的な一時変数を必要としない状態になれば完了です。

索引モデルが issue の本文から書いたものです。

評価

技術スタック
php
領域
compilers
issue の種類
バグ
難易度
4/5
見積もり時間
3〜5日
活発さ
停滞
明瞭さ
おおむね明確
初心者へのやさしさ
35/100

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。