역 참조 함수 결과를위한 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.
이것은 특히 php5.3에서는 지원되지 않지만 다음 릴리스 5.4에서 가능해야하는 배열 역 참조입니다. 현재 PHP 릴리스에서는 객체 역 참조가 가능합니다. 나는 또한이 기능을 기대하고있다!
-
==============================
2.
PHP는 함수의 배열 결과에 액세스 할 수 없습니다. 어떤 사람들은 이것을이 문제라고 부르며, 어떤 사람들은 이것을 언어가 어떻게 설계되어있는 것으로 받아들입니다. 따라서 PHP는 필요한 데이터를 추출하기 위해 필수 변수를 만들지 않습니다.
그래서 당신은해야합니다.
$var = foobar(); print($var[0]);
-
==============================
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.
상황에 따라 다음 솔루션 중 하나를 사용할 수 있습니다.
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.
대부분의 다른 프로그래밍 언어에 있지만 불행히도이를 수행 할 방법이 없습니다.
하나의 라이너를 실제로 만들고 싶다면 a ()라는 함수를 만들어 다음과 같이 할 수 있습니다.
$test = a(func(), 1); // second parameter is the key.
하지만 func () [1]은 PHP에서 지원되지 않습니다.
-
==============================
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.
이를 수행 할 래퍼 함수를 작성하십시오. PHP의 쉬운 타입 캐스팅 때문에 이것은 꽤 개방적 일 수 있습니다 :
function array_value ($array, $key) { return $array[$key]; }
-
==============================
8.
배열의 첫 번째 항목을 반환하려면 current () 함수를 사용하십시오.
return current($foo->getBarArray());
http://php.net/manual/en/function.current.php
-
==============================
9.
사실, 나는 이런 행동을 허용하는 라이브러리를 작성했다.
http://code.google.com/p/php-preparser/
모든 기능 : 기능, 방법. 캐시, PHP 자체만큼 빠름 :)
-
==============================
10.
PHP와 같은 식을 연결할 수 없기 때문에 array_test ()의 결과를 변수에 저장해야합니다.
이 시도:
function array_test() { return array(0, 1, 2); } $array = array_test(); echo $array[0];
-
==============================
11.
이것은 너무 멀리 가져 왔지만 실제로 한 줄에 있어야하는 경우 :
return index0( $foo->getBarArray() ); /* ... */ function index0( $some_array ) { return $some_array[0]; }
-
==============================
12.
물론 배열 대신 객체를 반환하고 다음과 같이 액세스 할 수 있습니다.
echo "This should be 2: " . test()->b ."\n";
하지만 배열을 사용하여이 작업을 수행 할 수있는 가능성을 찾지 못했습니다.
-
==============================
13.
내 일반적인 해결 방법은 이런 일반적인 함수를 가지고있다.
function e($a, $key, $def = null) { return isset($a[$key]) ? $a[$key] : $def; }
그리고
echo e(someFunc(), 'key');
보너스로, 이것은 또한 필요하지 않을 때 '정의되지 않은 인덱스'경고를 피할 수 있습니다.
왜 foo () [x]가 작동하지 않는지에 대한 대답은 무례하고 여기에 게시되지 않을 것입니다. ;)
-
==============================
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.
매우 빈민굴이지만, 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.
추가 연구 후 나는 대답이 '아니오'라고 믿는다. 임시 변수는 실제로 함수에서 반환 된 배열을 다루는 표준적인 방법이다.
PHP 5.4부터 변경 될 것입니다.
또한이 답변은 원래이 버전의 질문에 대한 것입니다.
함수에서 반환 된 배열을 사용할 때 PHP에서 임시 변수를 사용하지 않는 방법
-
==============================
17.
단지 미학적 인 경우 객체를 반환하면 객체 표기법이 작동합니다. 메모리 관리에 관한 한, 임시 복사본이 없으면 참조가 변경됩니다.
-
==============================
18.
짧은 답변:
예. 함수 결과와 PHP의 특정 버전이 PHP를 지원한다면 PHP에서 함수의 반환 값을 처리 할 수 있습니다.
참조 example2 :
// can php say "homer"? // print zoobar()->fname; // homer <-- yup
사례 :
-
==============================
19.
같은 일을하는 세 가지 방법이 있습니다.
-
==============================
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.
이게 효과가 있니?
return ($foo->getBarArray())[0];
그렇지 않으면 getBarArray () 함수를 게시 할 수 있습니까? 지금까지 게시 한 내용이 왜 작동하지 않는지 나는 알지 못합니다.
-
==============================
22.
참조를 사용할 수 있습니다.
$ref =& myFunc(); echo $ref['foo'];
그런 식으로 반환 된 배열의 복제본을 실제로 만들지는 않습니다.
from https://stackoverflow.com/questions/742764/php-syntax-for-dereferencing-function-result by cc-by-sa and MIT lisence
'PHP' 카테고리의 다른 글
빈 배열 요소를 제거하십시오. (0) | 2018.09.05 |
---|---|
치명적인 오류 : 멤버 함수 bind_param () 호출 부울 (0) | 2018.09.05 |
mysql을 mysqli로 바꾸는 방법? (0) | 2018.09.05 |
아파치가 PHP 파일을 표시하는 대신 다운로드하고 있습니다. (0) | 2018.09.05 |
PHP 세션이 하위 도메인으로 이월되도록 허용 (0) | 2018.09.05 |