用于解引用函数结果的PHP语法
背景 在我经常使用的其他编程语言中,对函数的返回值进行操作很简单,无需声明新变量来保存函数结果 然而,在PHP中,这似乎并不是那么简单: 示例1(函数结果为数组)用于解引用函数结果的PHP语法,php,arrays,syntax,function,Php,Arrays,Syntax,Function,背景 在我经常使用的其他编程语言中,对函数的返回值进行操作很简单,无需声明新变量来保存函数结果 然而,在PHP中,这似乎并不是那么简单: 示例1(函数结果为数组) 示例2(函数结果是一个对象) PHP无法从函数访问数组结果。有些人把这称为一个问题,有些人只是接受这是语言的设计方式。因此,PHP让您创建不重要的变量只是为了提取所需的数据 所以你需要这样做 $var = foobar(); print($var[0]); 那么,根据具体情况,您可以使用以下任一解决方案: function fo
示例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开始,可以取消对数组的引用:
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中引入)。看到并感到惊讶(而且,啊,害怕): 在大多数其他语言中,我们要做一些如此美丽的事情,需要经过漫长的过程
为了记录在案,我做了一些与诺尔特相似的事情。很抱歉,我让任何人的眼睛流血。有三种方法可以做同样的事情:
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];