没有键的递增数组访问表达式

bme*_*urn 2 php

为什么这在 PHP (7.3) 中没问题?它有什么用例吗?

<?php

$foo =  [10, 20, 30];
echo $foo[]++, "\n", ++$foo[], "\n", ++$foo[], "\n";
Run Code Online (Sandbox Code Playgroud)

输出:

php test.php

1
1
Run Code Online (Sandbox Code Playgroud)

我预计会出现如下读取错误。

<?php

$foo = [10, 20, 30];
$foo[] += 1; // No error either
$foo[] = $foo[] + 1; //PHP Fatal error:  Cannot use [] for reading in
Run Code Online (Sandbox Code Playgroud)

Nic*_*ick 5

$foo[]++首先创建一个新的null条目 in $foo,它被回显,导致一个空行(因为echo null;什么都不输出)。新条目$foo然后递增,因此null类型杂耍0为整数,从而产生 value 1

++$foo[]创建另一个新null条目 in $foo,在这种情况下,它在输出之前递增,因此两行1

如果您更改代码以使用var_dump而不是echo您可以更清楚地看到这一点:

$foo =  [10, 20, 30];
var_dump($foo[]++);
var_dump(++$foo[]);
var_dump(++$foo[]);
var_dump($foo);
Run Code Online (Sandbox Code Playgroud)

输出:

NULL
int(1)
int(1)
array(6) {
  [0]=>
  int(10)
  [1]=>
  int(20)
  [2]=>
  int(30)
  [3]=>
  int(1)
  [4]=>
  int(1)
  [5]=>
  int(1)
}
Run Code Online (Sandbox Code Playgroud)

3v4l.org 上的演示

请注意,与递增null,其结果在1递减 null没有影响(var_dump(--$foo[])输出null)。手册中描述了这种行为。