Синтаксис PHP для результата разыменования функции - PullRequest
34 голосов
/ 13 апреля 2009

Фон

В любом другом языке программирования, который я использую на регулярной основе, просто работать с возвращаемым значением функции без объявления новой переменной для хранения результата функции.

Однако в 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?

Ответы [ 22 ]

25 голосов
/ 13 апреля 2009

PHP не может получить доступ к результатам массива из функции. Некоторые люди называют это проблемой, некоторые просто принимают это как то, как разработан язык. Так что PHP заставляет вас создавать необязательные переменные просто для извлечения нужных вам данных.

Так что вам нужно сделать.

$var = foobar();
print($var[0]);
20 голосов
/ 25 октября 2011

Это специально разыменование массива, которое в настоящее время не поддерживается в php5.3, но должно быть возможно в следующей версии, 5.4. С другой стороны, разыменование объектов возможно в текущих версиях php. Я также с нетерпением жду этой функциональности!

17 голосов
/ 22 ноября 2009

Разыменование массива возможно с PHP 5.4:

Пример ( источник ):

function foo() {
    return array(1, 2, 3);
}
echo foo()[2]; // prints 3

с PHP 5.3 Вы получите

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

Оригинальный ответ:

Это было было задано уже до . Ответ - нет. Это невозможно.

К Цитата Энди Гутманс по этой теме:

Это хорошо известный запрос функции но не будет поддерживаться в PHP 5.0. я не могу сказать вам, будет ли это когда-либо поддерживается. Это требует некоторых исследований и много мыслей.

Вы также можете найти этот запрос число раз в PHP Bugtracker. Для технических деталей я предлагаю вам проверить официальный RFC и / или спросить на PHP Internals .

14 голосов
/ 13 апреля 2009

Ну, вы можете использовать любое из следующих решений, в зависимости от ситуации:

function foo() {
    return array("foo","bar","foobar","barfoo","tofu");
}
echo(array_shift(foo())); // prints "foo"
echo(array_pop(foo())); // prints "tofu"

Или вы можете получить определенные значения из возвращенного массива, используя list () :

list($foo, $bar) = foo();
echo($foo); // prints "foo"
echo($bar); // print "bar"

Редактировать: пример кода для each () , который я дал ранее, был неверным. each () возвращает пару ключ-значение. Так что может быть проще использовать foreach () :

foreach(foo() as $key=>$val) {
    echo($val);
}
7 голосов
/ 25 июля 2009

К сожалению, нет способа сделать это, хотя это есть в большинстве других языков программирования.

Если вы действительно хотите сделать один лайнер, вы можете создать функцию с именем () и сделать что-то вроде

$test = a(func(), 1); // second parameter is the key.

Но кроме этого, func () [1] не поддерживается в PHP.

5 голосов
/ 31 июля 2009

Если вы просто хотите вернуть первый элемент в массиве, используйте функцию current ().

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

http://php.net/manual/en/function.current.php

5 голосов
/ 25 июля 2009

Как уже упоминали другие, это невозможно. Синтаксис PHP не позволяет этого. Однако у меня есть одно предположение, которое решает проблему с другой стороны.

Если вы контролируете метод getBarArray и имеете доступ к стандартной библиотеке PHP (установленной на многих хостах PHP 5.2.X и установленной по умолчанию с PHP 5.3), вам следует рассмотреть возможность возврата <a href="http://us2.php.net/arrayobject" rel="nofollow noreferrer">ArrayObject</a> вместо нативный PHP массив / коллекция. ArrayObjects имеет метод <a href="http://us2.php.net/manual/en/arrayobject.offsetget.php" rel="nofollow noreferrer">offetGet</a>, который можно использовать для получения любого индекса, поэтому ваш код может выглядеть примерно так:

<?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);

И если вам когда-нибудь понадобится собственный массив / коллекция, вы всегда можете привести результаты.

//if you need 
$array = (array) $foo->getBarArray();
5 голосов
/ 07 июня 2009

Напишите функцию-обертку, которая будет выполнять то же самое. Из-за простого приведения типов в PHP это может быть довольно открытым:

function array_value ($array, $key) {
return $array[$key];
}
3 голосов
/ 01 ноября 2009

На самом деле, я написал библиотеку, которая позволяет такое поведение:

http://code.google.com/p/php-preparser/

Работает со всем: функциями, методами. Кэши, так же быстро, как и сам PHP:)

3 голосов
/ 17 февраля 2010

Вы не можете связать подобные выражения в PHP, поэтому вам придется сохранить результат array_test() в переменной.

Попробуйте это:

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

$array = array_test();
echo $array[0];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...