복붙노트

역 참조 함수 결과를위한 PHP 구문

PHP

역 참조 함수 결과를위한 PHP 구문

배경

필자가 정기적으로 사용하는 다른 모든 프로그래밍 언어에서는 함수 결과를 보유 할 새 변수를 선언하지 않고 함수의 반환 값을 처리하는 것이 간단합니다.

그러나 PHP에서는 이렇게 간단하지 않습니다.

<?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
?>
<?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에서 이것을 수행하는 방법을 제안 할 수 있습니까?

해결법

  1. ==============================

    1.

    이것은 특히 php5.3에서는 지원되지 않지만 다음 릴리스 5.4에서 가능해야하는 배열 역 참조입니다. 현재 PHP 릴리스에서는 객체 역 참조가 가능합니다. 나는 또한이 기능을 기대하고있다!

  2. ==============================

    2.

    PHP는 함수의 배열 결과에 액세스 할 수 없습니다. 어떤 사람들은 이것을이 문제라고 부르며, 어떤 사람들은 이것을 언어가 어떻게 설계되어있는 것으로 받아들입니다. 따라서 PHP는 필요한 데이터를 추출하기 위해 필수 변수를 만들지 않습니다.

    그래서 당신은해야합니다.

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

    3.

    배열 Dereferencing은 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 ';' 
    

    원문 답변 :

    이것은 이전에 이미 물어 보았습니다. 내 대답은 아니오 야. 그것은 불가능합니다.

    이 주제에 대한 Andi Gutmans의 말 :

    PHP Bugtracker에서이 요청을 여러 번 찾을 수도 있습니다. 기술적 인 세부 사항에 대해서는 공식 RFC를 확인하거나 PHP Internals에 요청하십시오.

  4. ==============================

    4.

    상황에 따라 다음 솔루션 중 하나를 사용할 수 있습니다.

    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 ()는 키 - 값 쌍을 반환합니다. 따라서 foreach ()를 사용하는 것이 더 쉽습니다.

    foreach(foo() as $key=>$val) {
        echo($val);
    }
    
  5. ==============================

    5.

    대부분의 다른 프로그래밍 언어에 있지만 불행히도이를 수행 할 방법이 없습니다.

    하나의 라이너를 실제로 만들고 싶다면 a ()라는 함수를 만들어 다음과 같이 할 수 있습니다.

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

    하지만 func () [1]은 PHP에서 지원되지 않습니다.

  6. ==============================

    6.

    다른 사람들이 언급했듯이, 이것은 불가능합니다. PHP의 구문은이를 허용하지 않습니다. 그러나 나는 다른 방향에서 그 문제를 공격하는 하나의 제안을 가지고있다.

    getBarArray 메서드를 제어하고 PHP 표준 라이브러리 (많은 PHP 5.2.X 호스트에 설치되어 있으며 기본적으로 PHP 5.3과 함께 설치됨)에 액세스 할 수있는 경우 기본 PHP 배열 / 컬렉션 대신 ArrayObject를 반환하는 것을 고려해야합니다. ArrayObject에는 offetGet 메서드가 있습니다.이 메서드는 모든 인덱스를 검색하는 데 사용할 수 있으므로 코드가 다음과 같이 보일 수 있습니다.

    <?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();
    
  7. ==============================

    7.

    이를 수행 할 래퍼 함수를 ​​작성하십시오. PHP의 쉬운 타입 캐스팅 때문에 이것은 꽤 개방적 일 수 있습니다 :

    function array_value ($array, $key) {
    return $array[$key];
    }
    
  8. ==============================

    8.

    배열의 첫 번째 항목을 반환하려면 current () 함수를 사용하십시오.

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

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

  9. ==============================

    9.

    사실, 나는 이런 행동을 허용하는 라이브러리를 작성했다.

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

    모든 기능 : 기능, 방법. 캐시, PHP 자체만큼 빠름 :)

  10. ==============================

    10.

    PHP와 같은 식을 연결할 수 없기 때문에 array_test ()의 결과를 변수에 저장해야합니다.

    이 시도:

    function array_test() {
      return array(0, 1, 2);
    }
    
    $array = array_test();
    echo $array[0];
    
  11. ==============================

    11.

    이것은 너무 멀리 가져 왔지만 실제로 한 줄에 있어야하는 경우 :

    
    return index0( $foo->getBarArray() );
    
    /* ... */
    
    function index0( $some_array )
    {
      return $some_array[0];
    }
    
    
  12. ==============================

    12.

    물론 배열 대신 객체를 반환하고 다음과 같이 액세스 할 수 있습니다.

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

    하지만 배열을 사용하여이 작업을 수행 할 수있는 가능성을 찾지 못했습니다.

  13. ==============================

    13.

    내 일반적인 해결 방법은 이런 일반적인 함수를 가지고있다.

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

    그리고

      echo e(someFunc(), 'key');
    

    보너스로, 이것은 또한 필요하지 않을 때 '정의되지 않은 인덱스'경고를 피할 수 있습니다.

    왜 foo () [x]가 작동하지 않는지에 대한 대답은 무례하고 여기에 게시되지 않을 것입니다. ;)

  14. ==============================

    14.

    이러한 방법으로 문제에 접근 할 수 있습니다.

    먼저 컬렉션의 일부가 아니지만 각각 별도의 의미를 갖는 변수 배열을 반환하면 변수의 이름을 직접 지정할 수 있습니다.

    다른 두 가지 방법은 값의 모음 인 결과를 반환하는 것입니다.

    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";
    
  15. ==============================

    15.

    매우 빈민굴이지만, PHP만으로 할 수 있습니다. 이것은 람다 함수 (PHP 5.3에서 소개되었습니다)를 사용합니다. 보고 놀란다 (그리고, 에헴, 겁에 질린) :

    function foo() {
        return array(
            'bar' => 'baz',
            'foo' => 'bar',
    }
    
    // prints 'baz'
    echo call_user_func_array(function($a,$k) { 
        return $a[$k]; 
    }, array(foo(),'bar'));
    

    대부분의 다른 언어에서 너무 아름다운 것을하기 위해해야 ​​할 길이.

    기록을 위해 나는 놀테가하는 것과 비슷한 것을한다. 미안 누군가의 눈을 피로했다면.

  16. ==============================

    16.

    추가 연구 후 나는 대답이 '아니오'라고 믿는다. 임시 변수는 실제로 함수에서 반환 된 배열을 다루는 표준적인 방법이다.

    PHP 5.4부터 변경 될 것입니다.

    또한이 답변은 원래이 버전의 질문에 대한 것입니다.

    함수에서 반환 된 배열을 사용할 때 PHP에서 임시 변수를 사용하지 않는 방법

  17. ==============================

    17.

    단지 미학적 인 경우 객체를 반환하면 객체 표기법이 작동합니다. 메모리 관리에 관한 한, 임시 복사본이 없으면 참조가 변경됩니다.

  18. ==============================

    18.

    짧은 답변:

    예. 함수 결과와 PHP의 특정 버전이 PHP를 지원한다면 PHP에서 함수의 반환 값을 처리 할 수 ​​있습니다.

    참조 example2 :

    //  can php say "homer"?      
    //  print zoobar()->fname;     //  homer <-- yup
    

    사례 :

  19. ==============================

    19.

    같은 일을하는 세 가지 방법이 있습니다.

  20. ==============================

    20.

    이전에는 PHP 5.3에서 다음과 같이했습니다 :

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

    결과 : 2

    PHP 5.4에서 다음과 같이 배열을 역 참조 할 수 있습니다 :

    function returnArray() {
      return array(1, 2, 3);
    }
    $secondElement = returnArray()[1];
    

    결과 : 2

    PHP 5.5부터 :

    당신은 영리해질 수 있습니다.

    echo [1, 2, 3][1];
    

    결과 : 2

    문자열을 사용하여 동일한 작업을 수행 할 수도 있습니다. 문자열 참조 해제라고합니다.

    echo 'PHP'[1];
    

    결과 : H

  21. ==============================

    21.

    이게 효과가 있니?

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

    그렇지 않으면 getBarArray () 함수를 게시 할 수 있습니까? 지금까지 게시 한 내용이 왜 작동하지 않는지 나는 알지 못합니다.

  22. ==============================

    22.

    참조를 사용할 수 있습니다.

    $ref =& myFunc();
    echo $ref['foo'];
    

    그런 식으로 반환 된 배열의 복제본을 실제로 만들지는 않습니다.

  23. from https://stackoverflow.com/questions/742764/php-syntax-for-dereferencing-function-result by cc-by-sa and MIT lisence