<?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}
= 空 - i', 'e' => 'j'(
- 所以现在$NULL包含数组
我们再次看到构造${!(condition)
这意味着$NULL(请参阅第一点和第二点(,因此我们可以将其转换为: -
$NULL['a']
($NULL包含数组(
${!1} = ReturnArray()
= array('a' => 'f', 'b' => 'g', 'c' => 'h', 'd' => '您可以轻松检查以下内容:
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 将它们转换为字符串。