PHP-foreachはnull合体演算子で参照を失います

feistiny

Q1:次の??場合は何もしないと思います

$a = [1, 2];
foreach ($a ?? [] as &$v) {
    $v++;
}
var_dump($a);

しかし、なぜ?

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

Q2:これはもっと奇妙です:

foreach ($a = [1, 2] as &$v) {
    $v++;
}
var_dump($a);
// output
array(2) {
  [0]=>
  int(1)
  [1]=>
  int(2)
}

私の考え:式は参照できないと思いますがforeach、エラーをキャッチするか、何らかの方法でコピーを作成します。動作する参照:

$a = 1;
$c = &$a;

動作しない:

$a = 1;
$c = &($a);
$c = &($a ?? []);
$c = &($a + 1);

ドスは、??コピーを作成しますか?ifがnullforeachであるため、をラップしたくないので失敗します。if (isset($a))$aforeach

ジャック

TL; DRあなたの場合、次のようにnull合体演算子を使用することを検討できます。

$a = $a ?? [];
foreach ($a as &$v) { ... }

または、array_map()キーを使用するか、キーを使用して基になる配列を変更することにより、参照をまったく使用しないでください

Q1

$a = [1, 2];
foreach ($a ?? [] as &$v) {
    $v++;
}
var_dump($a);

合体演算子は元の配列のコピーを使用し、の場合は右側のオペランドを適用しnullます。したがって、反復は元の配列のコピーに対して行われます。

これを次のものと比較できます。

$a = [1, 2];
$x = $a ?? [];
$x[1] = 4;
var_dump($a); // [1, 2]

コードインサイト

compiled vars:  !0 = $a, !1 = $v
line     #* E I O op                           fetch          ext  return  operands
-------------------------------------------------------------------------------------
   8     0  E >   ASSIGN                                                   !0, <array>
   9     1        COALESCE                                         ~3      !0
         2        QM_ASSIGN                                        ~3      <array>
         3      > FE_RESET_RW                                      $4      ~3, ->8
... rest of looping code

の最初のオペランドFE_RESET_RWは、繰り返されるハッシュ変数で~3あり、!0$aコード内で)代わりに、予想どおりに行われていることがわかります。

Q2

foreach ($a = [1, 2] as &$v) {
    $v++;
}

ここで何が起こるかというと、割り当ての戻り値が$a = [1, 2]反復する配列として使用されます。

この動作を次のようなものと比較できます。

$x = $a = [1, 2];
$x[0] = 4; // modify in-place
var_dump($a); // [1, 2]

コードインサイト

compiled vars:  !0 = $a, !1 = $v
line     #* E I O op                           fetch          ext  return  operands
-------------------------------------------------------------------------------------
   3     0  E >   ASSIGN                                           $2      !0, <array>
         1      > FE_RESET_RW                                      $3      $2, ->6
... rest of looping code

繰り返しますが、$2FE_RESET_RW割り当て結果であるの最初のオペランドであるため、!0$aコード内で)に対して反復は発生しません

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

PHPの三項演算子とnull合体演算子で「else」を省略します

分類Dev

配列でPHPのnull合体演算子を使用する

分類Dev

PHP 7でnull合体演算子を使用するときに、入力フィールドをいくつかの追加関数でラップできますか?

分類Dev

PythonはPHPのnull合体演算子および短縮三項演算子に相当しますか?

分類Dev

PHP Null合体演算子(??)を比較して使用したい

分類Dev

PHPが設定され、Null合体演算子が連結演算子でNoticeをスローするのはなぜですか?

分類Dev

PHPのnull合体演算子(??)が、可視性の異なるクラス定数で機能しないのはなぜですか?

分類Dev

複数のヌル合体演算子を使用できますか?|| PHPと同じようにVueで?

分類Dev

null合体代入とは?? = PHP7.4の演算子

分類Dev

PHPの三項演算子とnullの合体演算子

分類Dev

PHPで?? =を意味する演算子はありますか?

分類Dev

PHPの三項演算子で論理演算子を使用できますか

分類Dev

PHPのnull合体+三項演算子の奇妙な動作

分類Dev

PHPで剰余/%演算子のスローエラーを取得しています

分類Dev

PHP演算子-> {...}はどういう意味ですか?

分類Dev

PHPで+ =演算子をカスケードできますか?

分類Dev

foreach内で文字列を構築するPHPオブジェクト演算子?

分類Dev

PHPで三項演算子if-elseif-elseを使用する方法は?

分類Dev

PHPで算術演算子を連結する方法は?

分類Dev

PHP非falsyヌル合体演算子

分類Dev

PHPで「Nullsafe演算子」を使用するにはどうすればよいですか

分類Dev

PHPでは、Actionscriptの「is」演算子に似ているものは何ですか?

分類Dev

phpなぜまたは演算子は0をtrueとして返すのですか

分類Dev

PHPで3値演算子と比較演算子はどのように機能しますか?

分類Dev

「[」をPHP言語仕様の演算子にするにはどうすればよいですか?

分類Dev

PHPの文字列から文字、整数、演算子を分離するにはどうすればよいですか?

分類Dev

Java は '+' 演算子を ' ' に置き換えて、テキストを php url に投稿しています

分類Dev

PHPで二重疑問符(?)演算子はどういう意味ですか

分類Dev

PHP:等しくない演算子と同一でない演算子はどのように機能し、等しいまたは同一の演算子よりも高速ですか?

Related 関連記事

  1. 1

    PHPの三項演算子とnull合体演算子で「else」を省略します

  2. 2

    配列でPHPのnull合体演算子を使用する

  3. 3

    PHP 7でnull合体演算子を使用するときに、入力フィールドをいくつかの追加関数でラップできますか?

  4. 4

    PythonはPHPのnull合体演算子および短縮三項演算子に相当しますか?

  5. 5

    PHP Null合体演算子(??)を比較して使用したい

  6. 6

    PHPが設定され、Null合体演算子が連結演算子でNoticeをスローするのはなぜですか?

  7. 7

    PHPのnull合体演算子(??)が、可視性の異なるクラス定数で機能しないのはなぜですか?

  8. 8

    複数のヌル合体演算子を使用できますか?|| PHPと同じようにVueで?

  9. 9

    null合体代入とは?? = PHP7.4の演算子

  10. 10

    PHPの三項演算子とnullの合体演算子

  11. 11

    PHPで?? =を意味する演算子はありますか?

  12. 12

    PHPの三項演算子で論理演算子を使用できますか

  13. 13

    PHPのnull合体+三項演算子の奇妙な動作

  14. 14

    PHPで剰余/%演算子のスローエラーを取得しています

  15. 15

    PHP演算子-> {...}はどういう意味ですか?

  16. 16

    PHPで+ =演算子をカスケードできますか?

  17. 17

    foreach内で文字列を構築するPHPオブジェクト演算子?

  18. 18

    PHPで三項演算子if-elseif-elseを使用する方法は?

  19. 19

    PHPで算術演算子を連結する方法は?

  20. 20

    PHP非falsyヌル合体演算子

  21. 21

    PHPで「Nullsafe演算子」を使用するにはどうすればよいですか

  22. 22

    PHPでは、Actionscriptの「is」演算子に似ているものは何ですか?

  23. 23

    phpなぜまたは演算子は0をtrueとして返すのですか

  24. 24

    PHPで3値演算子と比較演算子はどのように機能しますか?

  25. 25

    「[」をPHP言語仕様の演算子にするにはどうすればよいですか?

  26. 26

    PHPの文字列から文字、整数、演算子を分離するにはどうすればよいですか?

  27. 27

    Java は '+' 演算子を ' ' に置き換えて、テキストを php url に投稿しています

  28. 28

    PHPで二重疑問符(?)演算子はどういう意味ですか

  29. 29

    PHP:等しくない演算子と同一でない演算子はどのように機能し、等しいまたは同一の演算子よりも高速ですか?

ホットタグ

アーカイブ