为我解释PHP的这个片段:返回数组并立即引用索引


Explain this fragment of PHP for me: returning array and immediately reference an index

<?php
function ReturnArray() {
    return array('a' => 'f', 'b' => 'g', 'c' => 'h', 'd' => 'i', 'e' => 'j');
}
echo ${!${!1}=ReturnArray()}['a']; // 'f'
?>

请解释上述解决方案中那些 ${!1} 计算的逻辑和步骤是什么,效果很好。

让我们从一些基础知识开始。在 PHP 中,类似于 hello 的东西将计算为字符串"hello" 。若要引用变量,可以使用以下语法:${expr} 。还有一个简写,$foo,大致计算一下:${"foo"}

另外,您可能知道可以一次分配多个变量:例如$a=$b=$c='hello';。这会将$a$b$c分配给'hello'。这实际上表示为 $a=($b=($c='hello'))); . $foo=value是一个表达式,在设置$foo后,其计算结果将value

您的代码语句如下所示:

echo ${!${!1}=ReturnArray()}['a'];

显然,它做的第一件事是 呼叫ReturnArray .然后它计算!1,计算结果为假。因此,${!1} 生成一个名为 false 的变量,尽管不是字符串(?!(。之后,它将 not 操作应用于数组。所有非空数组都是真实的,因此 not 操作将其更改为 false 。然后,它再次使用该${}语法来检索名为 false 的变量。然后,它使用数组访问来检索数组中的值以进行键'a'

我希望这是有道理的。

  1. !1 = 假
  2. ${!1} = 空
  3. ${!1} = ReturnArray() = array('a' => 'f', 'b' => 'g', 'c' => 'h', 'd' => '
  4. i', 'e' => 'j'(
  5. 所以现在$NULL包含数组
    我们再次看到构造${!(condition)这意味着$NULL(请参阅第一点和第二点(,因此我们可以将其转换为:
  6. $NULL['a']($NULL包含数组(

您可以轻松检查以下内容:
print_r(${NULL}); - 您将看到数组;)

${!1}计算结果为${false}
!${false = ReturnArray()}的计算结果为 $true = array('a' => 'f', /* etc */) .
echo $true['a']产生'f',因为'f'对应于索引'a'

我现在很好奇,这是从哪里来的?

同时,

我找到了一个答案,所以我把它贴在这里:

echo ${!${!1}=ReturnArray()}['a'];
${!${!1}=ReturnArray()}['a']
 !1 resolves to false.
${!${false}=ReturnArray()}['a']
 false resolves to... I don't know. Let's just say false resolves to a variable "a".
${!$a=ReturnArray()}['a']
 $a is now the array. The ! changes the returned array into the boolean false (like: if (!$handle = fopen('x', 'r')) { echo 'connection failed' }.
${false}['a']
 I don't know what false resolves to, but we're using again variable "a".
$a['a'] // this is trivial

我直言,这主要是纯粹的噪音。代码将数组分配给变量,然后检索键a,这显然是f。我只是使用布尔值来生成中间变量名称,并让 PHP 将它们转换为字符串。