从函数返回时访问数组元素

9

通过谷歌搜索(以及我的个人经验),我发现在PHP中,当一个数组元素被从同一行的函数调用中返回时,你无法获取它。例如,你不能这样做:

echo getArray()[0];

然而,我发现了一个很棒的小技巧:
echo ${!${false}=getArray()}[0];

它实际上是起作用的。问题是,我不知道它为什么起作用。如果有人能够解释一下,那就太好了。

谢谢。


1
它绝对不会使您的代码更易读 ;) - Felix Kling
3个回答

10
echo ${!${false}=getArray()}[0];

以下是详细的步骤说明:

${false}=getArray()

将getArray的结果分配给一个空名称的变量(可以使用''或null代替false)

!${false}=getArray()

将上述值取反,转换为布尔值false

 ${!${false}=getArray()}

将先前(false)的值转换为(空)字符串,并使用此字符串作为变量名。也就是说,这是步骤1中的变量,等于getArray的结果。

${!${false}=getArray()}[0];

获取那个“空”变量的索引,然后返回数组元素。

同样思路的更多变体

echo ${1|${1}=getArray()}[1];
echo ${''.$Array=getArray()}[1];

function p(&$a, $b) { $a = $b; return '_'; }
echo ${p($_, getArray())}[1];

为什么getArray()[0]无法工作,原因是PHP团队不知道如何让它工作。


3

它能够工作是因为你使用大括号将值转换为变量,这里有一个例子。

$hello = 'test';
echo ${"hello"};

为什么需要这个,如果您想将字符串或返回值转换为变量,就需要这个。例如:

${$_GET['var']} = true;

这是不好的做法,我认为绝不能使用。

如果您希望直接运行函数,应该使用对象,例如:

function test()
{
   $object = new stdClass();
   $object->name = 'Robert';

   return $object;
}
echo test()->name;

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。

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