用于解引用函数结果的PHP语法

用于解引用函数结果的PHP语法,php,arrays,syntax,function,Php,Arrays,Syntax,Function,背景 在我经常使用的其他编程语言中,对函数的返回值进行操作很简单,无需声明新变量来保存函数结果 然而,在PHP中,这似乎并不是那么简单: 示例1(函数结果为数组) 示例2(函数结果是一个对象) PHP无法从函数访问数组结果。有些人把这称为一个问题,有些人只是接受这是语言的设计方式。因此,PHP让您创建不重要的变量只是为了提取所需的数据 所以你需要这样做 $var = foobar(); print($var[0]); 那么,根据具体情况,您可以使用以下任一解决方案: function fo

背景

在我经常使用的其他编程语言中,对函数的返回值进行操作很简单,无需声明新变量来保存函数结果

然而,在PHP中,这似乎并不是那么简单:

示例1(函数结果为数组)

示例2(函数结果是一个对象)
PHP无法从函数访问数组结果。有些人把这称为一个问题,有些人只是接受这是语言的设计方式。因此,PHP让您创建不重要的变量只是为了提取所需的数据

所以你需要这样做

$var = foobar();
print($var[0]);

那么,根据具体情况,您可以使用以下任一解决方案:

function foo() {
    return array("foo","bar","foobar","barfoo","tofu");
}
echo(array_shift(foo())); // prints "foo"
echo(array_pop(foo())); // prints "tofu"
或者可以使用list()从返回的数组中获取特定值:

编辑:我前面给出的每个()的示例代码都不正确。each()返回一个键值对。因此,使用foreach()可能更容易:


编写一个包装函数来完成同样的任务。由于PHP易于类型转换,这可能是非常开放的:

function array_value ($array, $key) {
return $array[$key];
}
这行吗

 return ($foo->getBarArray())[0];

否则,可以发布getBarArray()函数吗?从您目前发布的内容来看,我不明白为什么这样做行不通。

不幸的是,没有一种方法可以做到这一点,尽管在大多数其他编程语言中都是这样

如果你真的想做一个单行程序,你可以做一个叫做a()的函数

$test = a(func(), 1); // second parameter is the key.
<?php
class Example {
    function getBarArray() {
        $array = new ArrayObject();
        $array[] = 'uno';
        $array->append('dos');
        $array->append('tres');
        return $array;
    }
}

$foo = new Example();
$value = $foo->getBarArray()->offsetGet(2);

但除此之外,PHP中不支持func()[1]。

这太牵强了,但如果您确实需要将其放在一行中:


return index0( $foo->getBarArray() );

/* ... */

function index0( $some_array )
{
  return $some_array[0];
}


正如其他人所提到的,这是不可能的。PHP的语法不允许这样做。然而,我确实有一个建议从另一个方向攻击这个问题

如果你在控制<代码> GETBARARTALS/<代码>方法,并且可以访问PHP标准库(安装在许多PHP 5.2 .x主机上,默认情况下用PHP 5.3安装),你应该考虑返回<代码> <代码>,而不是本地PHP数组/集合。code>ArrayObject有一个

方法,可用于检索任何索引,因此您的代码可能类似于

$test = a(func(), 1); // second parameter is the key.
<?php
class Example {
    function getBarArray() {
        $array = new ArrayObject();
        $array[] = 'uno';
        $array->append('dos');
        $array->append('tres');
        return $array;
    }
}

$foo = new Example();
$value = $foo->getBarArray()->offsetGet(2);

如果只想返回数组中的第一项,请使用current()函数

return current($foo->getBarArray());

事实上,我已经编写了一个允许此类行为的库:


适用于一切:函数、方法。缓存,因此与PHP本身一样快:)

经过进一步研究,我相信答案是否定的,像这样的临时变量确实是处理函数返回的数组的标准方法

return current($foo->getBarArray());
看起来这将从PHP5.4开始改变

此外,这个答案最初是针对这个问题的:


当然,您可以返回一个对象而不是数组,并通过以下方式访问它:

echo "This should be 2: " . test()->b ."\n";

但是我没有发现用数组实现这一点的可能性:(

如果只是美观,那么如果返回对象,对象表示法就会起作用。就内存管理而言,没有临时拷贝,只有更改引用。

我通常的解决方法是使用这样的通用函数

 function e($a, $key, $def = null) { return isset($a[$key]) ? $a[$key] : $def; }
然后

  echo e(someFunc(), 'key');
另外,这还可以避免在不需要时出现“未定义索引”警告


至于
foo()[x]
不起作用的原因,答案很不礼貌,不会在这里公布。

这些是解决问题的一些方法

首先,如果返回的变量数组不是集合的一部分,但每个变量都有单独的含义,则可以使用直接命名变量

其他两种方法用于返回值集合的结果

function test() {
  return array(1, 2);
}   
list($a, $b) = test();
echo "This should be 2: $b\n";

function test2() {
   return new ArrayObject(array('a' => 1, 'b' => 2), ArrayObject::ARRAY_AS_PROPS);
}
$tmp2 = test2();
echo "This should be 2: $tmp2->b\n";

function test3() {
   return (object) array('a' => 1, 'b' => 2);
}
$tmp3 = test3();
echo "This should be 2: $tmp3->b\n";

您可以使用参考资料:

$ref =& myFunc();
echo $ref['foo'];
这样,您就不会真正创建返回数组的副本。

从PHP5.4开始,可以取消对数组的引用:

示例(): 使用PHP5.3

Parse error: syntax error, unexpected '[', expecting ',' or ';' 

原始答案:

这是一个很好的例子。答案是否定的,这是不可能的

关于这一主题:

这是一个众所周知的功能请求 但在PHP5.0中不受支持。我 我不能告诉你这是否会发生 支持。这需要一些研究 还有很多想法


您也可以在PHP Bugtracker中找到这一点。关于技术细节,我建议您检查和/或询问。

在PHP中不能像这样链接表达式,因此您必须将
array\u test()
的结果保存在变量中

试试这个:

function array_test() {
  return array(0, 1, 2);
}

$array = array_test();
echo $array[0];

非常贫民区,但是,它只能使用PHP完成。这利用了lambda函数(在PHP5.3中引入)。看到并感到惊讶(而且,啊,害怕):

在大多数其他语言中,我们要做一些如此美丽的事情,需要经过漫长的过程


为了记录在案,我做了一些与诺尔特相似的事情。很抱歉,我让任何人的眼睛流血。

有三种方法可以做同样的事情:

  • 正如Cha102所说,使用函数返回索引值:

    function get($from, $id){
        return $from[$id];
    }
    
    然后,您可以使用:

    get($foo->getBarArray(),0);
    
    获取第一个元素,依此类推

  • 使用当前和数组_切片的惰性方法:

    $first = current(array_slice($foo->getBarArray(),0,1));
    $second = current(array_slice($foo->getBarArray(),1,1));
    
  • 使用相同的函数返回数组和值:

    class FooClass {
        function getBarArray($id = NULL) {
            $array = array();
    
            // Do something to get $array contents
    
            if(is_null($id))
                return $array;
            else
                return $array[$id];
            }
    }
    
    然后可以获得整个数组和单个数组项

    $array = $foo->getBarArray();
    


  • 这就是数组解引用,目前php5.3中不支持这种方法,但在下一版本5.4中应该可以实现。另一方面,在当前的php版本中,对象取消引用是可能的。我也很期待这个功能

    简短回答:

    对。只要函数结果和特定版本的PHP支持,就可以在PHP中对函数的返回值进行操作

    参考示例2:

    //  can php say "homer"?      
    //  print zoobar()->fname;     //  homer <-- yup
    
    //php能说“荷马”吗?
    
    //打印zoobar()->fname;//荷马之前在PHP5.3中,您必须这样做:

    function returnArray() {
      return array(1, 2, 3);
    }
    $tmp = returnArray();
    $ssecondElement = $tmp[1];
    
    结果:
    2

    从PHP5.4开始,这是可能的
    class FooClass {
        function getBarArray($id = NULL) {
            $array = array();
    
            // Do something to get $array contents
    
            if(is_null($id))
                return $array;
            else
                return $array[$id];
            }
    }
    
    $array = $foo->getBarArray();
    
    $first_item = $foo->getBarArray(0);
    
    //  can php say "homer"?      
    //  print zoobar()->fname;     //  homer <-- yup
    
    function returnArray() {
      return array(1, 2, 3);
    }
    $tmp = returnArray();
    $ssecondElement = $tmp[1];
    
    function returnArray() {
      return array(1, 2, 3);
    }
    $secondElement = returnArray()[1];
    
    echo [1, 2, 3][1];
    
    echo 'PHP'[1];