【发布时间】:2010-12-18 15:33:30
【问题描述】:
背景
在我经常使用的所有其他编程语言中,对函数的返回值进行操作很简单,而无需声明一个新变量来保存函数结果。
然而,在 PHP 中,这似乎并不那么简单:
example1(函数结果为数组)
<?php
function foobar(){
return preg_split('/\s+/', 'zero one two three four five');
}
// can php say "zero"?
/// print( foobar()[0] ); /// <-- nope
/// print( &foobar()[0] ); /// <-- nope
/// print( &foobar()->[0] ); /// <-- nope
/// print( "${foobar()}[0]" ); /// <-- nope
?>
example2(函数结果是一个对象)
<?php
function zoobar(){
// NOTE: casting (object) Array() has other problems in PHP
// see e.g., http://stackoverflow.com/questions/1869812
$vout = (object) Array('0'=>'zero','fname'=>'homer','lname'=>'simpson',);
return $vout;
}
// can php say "zero"?
// print zoobar()->0; // <- nope (parse error)
// print zoobar()->{0}; // <- nope
// print zoobar()->{'0'}; // <- nope
// $vtemp = zoobar(); // does using a variable help?
// print $vtemp->{0}; // <- nope
【问题讨论】:
-
为了方便不滚动到后面答案的读者,PHP 5.4 中添加了数组取消引用(在此评论时处于测试阶段)...
-
注意:此问题被错误地标记为与 array dereferencing 重复。 这个问题不是重复的,因为它不仅仅与数组有关。 PHP 函数可以返回任何值类型,而不仅仅是数组(参见原帖中的示例 2,其中函数结果是一个对象,而不是数组)。
-
对于那些懒得通读所有答案的人来说,最“漂亮”的解决方案是
call_user_func(function($a, $b){return $a[$b];}, $arr, $offset)。亚军奖颁给current(array_slice($arr, $offset, 1))。 -
@Pacerier 你用什么标准比另一个更“漂亮”?一个更有效率吗?坦白说,第二种选择写起来更快更容易。
标签: php arrays syntax function