在分配的函数返回数组上调用数组键?

Calling Array Key on Assigned Function Returned Array?

从 PHP 5.4,我可以调用 函数的 元素 返回数组 ,像这样:func()['el'].

我是 运行 PHP 5.6 并测试以下(简化)代码:

有效

$decoded = json_decode($content, true)['foo'];

不起作用

($decoded = json_decode($content, true))['foo']; // syntax error ['

我不明白为什么我不能将json_decode($content, true)赋值给$decoded并立即调用元素foo。这在 php 7

中工作正常

为什么这很有趣?

我的 PhpStorm 2017.2.1,已应用 php 5.6 不会 将此代码检测为 仅在 PHP 7 中可用!

PHP 7 引入的众多功能之一是 Abstract Syntax Tree。这直接导致了更复杂的表达式成为可能,例如您问题中的表达式。

简单地说,变化是以前用方括号包裹的函数 return 的行为与不在方括号中的函数的行为不同:

<?php
function foo() { return ['a' => 'b']; }

echo foo()['a']; // Works in PHP 5.4+
echo (foo())['a']; // Works in PHP 7+

正如您提到的,函数式数组取消引用是在 5.4 中添加的,但仅作为解析器中的一种特殊情况。在 PHP 7+ 中,您可以取消引用任何生成数组的表达式。