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

3
为什么在PHP(7.3)中可以这样写?它有什么用途吗?
<?php

$foo =  [10, 20, 30];
echo $foo[]++, "\n", ++$foo[], "\n", ++$foo[], "\n";

输出:

php test.php

1
1

我期待看到以下类似的读取错误。
<?php

$foo = [10, 20, 30];
$foo[] += 1; // No error either
$foo[] = $foo[] + 1; //PHP Fatal error:  Cannot use [] for reading in
2个回答

6

$foo[]++ 首先在 $foo 中创建了一个新的、null 的条目,这个条目被输出,结果是一行空白(因为 echo null; 输出了空值)。然后增加了 $foo 中的新条目,使得 null 被强制转换成整数类型的 0,最终的结果是 1

++$foo[]$foo 中创建了另一个新的、null 的条目,但这个条目在被输出前已经被增加了,所以会输出两行带有 1 的内容。

如果你修改代码使用 var_dump 代替 echo,你就能更清楚地看到这一过程:

$foo =  [10, 20, 30];
var_dump($foo[]++);
var_dump(++$foo[]);
var_dump(++$foo[]);
var_dump($foo);

输出:

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)
}

在3v4l.org上查看演示

请注意,与将 null 递增的结果为 1 不同,递减 null 没有任何效果(var_dump(--$foo[]) 输出 null)。关于此行为,请参阅手册


2
这种奇怪的推送技术是我无法想象在项目中需要的,很可能会让脚本的未来读者感到困惑。
从3v4l.org来看,这种行为在php7.2及以上版本中是一致的。
第一个增量是后增量,因此在递增之前显示了等于null的初始$foo[]。
接下来两个增量是前增量,所以它们正在输出递增的值。
将null递增会创建1,然后被回显并存储为1。 将null递减会创建null,然后存储为null并作为空字符串回显。
代码: (演示)
$foo =  [10, 20, 30];
echo $foo[]++;
echo "\n---\n";
var_export($foo);
echo "\n---\n";
echo ++$foo[], "\n", --$foo[], "\n";
var_export($foo);
echo "\n===\n";
var_export(--$foo[]);

输出:

---
array (
  0 => 10,
  1 => 20,
  2 => 30,
  3 => 1,
)
---
1

array (
  0 => 10,
  1 => 20,
  2 => 30,
  3 => 1,
  4 => 1,
  5 => NULL,
)
===
NULL

自从php7.3以后,发生了一些变化,即array_push()现在可以接受一个单一参数。(演示

$foo = [];
array_push($foo);
var_export($foo);

上面的代码片段没有实际作用,它不会添加任何新元素。计数仍然为零,但在php7.3中不会生成警告。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接