通过Google(以及我自己的经验)进行的一些搜索显示,在PHP中,当从同一行的函数调用返回时,您无法获取数组元素。例如,您不能这样做:
echo getArray()[0];
然而,我遇到了一个巧妙的小技巧:
echo ${!${false}=getArray()}[0];
它确实有效。问题是,我不知道为什么它的工作原理。如果有人能够解释,那就太好了。
感谢。
答案 0 :(得分:10)
echo ${!${false}=getArray()}[0];
这就是它的工作原理,一步一步
${false}=getArray()
将getArray的结果分配给具有空名称的变量(''或null将起作用而不是false)
!${false}=getArray()
否定上述值,将其转换为布尔值假
${!${false}=getArray()}
将前一个(false)值转换为(空)字符串,并将此字符串用作变量名称。也就是说,这是步骤1中的变量,等于getArray的结果。
${!${false}=getArray()}[0];
获取该“empty”变量的索引并返回一个数组元素。
同一想法的更多变体
echo ${1|${1}=getArray()}[1];
echo ${''.$Array=getArray()}[1];
function p(&$a, $b) { $a = $b; return '_'; }
echo ${p($_, getArray())}[1];
至于为什么getArray()[0]
不起作用,这是因为php团队不知道如何让它工作。
答案 1 :(得分:3)
它的工作原理是因为您使用大括号将值转换为变量,这是一个例子。
$hello = 'test';
echo ${"hello"};
为什么需要这个,需要包含你想要将字符串或返回值转换为变量,例如
${$_GET['var']} = true;
这是不好的做法,永远不应该用于IMO。
如果你想直接运行函数,你应该使用对象,例如
function test()
{
$object = new stdClass();
$object->name = 'Robert';
return $object;
}
echo test()->name;
答案 2 :(得分:2)
应该注意的是,可以执行PHP 5.4之后的操作。从阵列解除引用手册:
从PHP 5.4开始,可以直接对函数或方法调用的结果进行数组取消引用。之前只能使用临时变量。
示例:
function theArray() {
return range(1, 10);
}
echo theArray()[0];
// PHP 5.4+: 1
// PHP -5.4: null
PHP 5.4之前:尝试访问尚未定义的数组键与访问任何其他未定义的变量相同:将发出E_NOTICE级错误消息,结果将为NULL。
<强>手册强>