[php] 함수에서 여러 번 반환

다음과 같이 두 개의 리턴을 가진 함수를 가질 수 있습니까?

function test($testvar)
{
  // Do something

  return $var1;
  return $var2;
}

그렇다면 어떻게 각 반품을 개별적으로 얻을 수 있습니까?



답변

2 개의 변수를 반환하는 방법은 없습니다. 그러나 배열을 전파하고 반환 할 수 있습니다 . 동적 변수 등을 반환하는 조건부 생성

예를 들어이 함수는 $var2

function wtf($blahblah = true) {
    $var1 = "ONe";
    $var2 = "tWo";

    if($blahblah === true) {
      return $var2;
    }
    return $var1;
}

신청에서 :

echo wtf();
//would echo: tWo
echo wtf("not true, this is false");
//would echo: ONe

둘 다 원한다면 함수를 약간 수정할 수 있습니다.

function wtf($blahblah = true) {
    $var1 = "ONe";
    $var2 = "tWo";

    if($blahblah === true) {
      return $var2;
    }

    if($blahblah == "both") {
      return array($var1, $var2);
    }

    return $var1;
}

echo wtf("both")[0]
//would echo: ONe
echo wtf("both")[1]
//would echo: tWo

list($first, $second) = wtf("both")
// value of $first would be $var1, value of $second would be $var2


답변

기술적으로는 둘 이상의 값을 반환 할 수 없습니다. 그러나 이러한 제한을 해결하는 방법에는 여러 가지가 있습니다. 여러 값을 반환하는 것과 가장 유사한 방식은 list키워드를 사용하는 것입니다.

function getXYZ()
{
    return array(4,5,6);
}

list($x,$y,$z) = getXYZ();

// Afterwards: $x == 4 && $y == 5 && $z == 6
// (This will hold for all samples unless otherwise noted)

기술적으로 배열을 반환 list하고 실제 배열을 저장하는 대신 해당 배열의 요소를 다른 값으로 저장하는 데 사용합니다. 이 기술을 사용하면 여러 값을 반환하는 것처럼 느껴집니다 .

list솔루션은 다소 PHP 전용 솔루션입니다. 비슷한 구조를 가진 몇 가지 언어가 있지만 그렇지 않은 언어가 더 있습니다. 여러 값을 “반환”하는 데 일반적으로 사용되는 다른 방법이 있으며 거의 ​​모든 언어 (한 가지 방법으로)로 사용할 수 있습니다. 그러나이 방법은 상당히 다르게 보일 수 있으므로 익숙해 져야 할 수도 있습니다.

// note that I named the arguments $a, $b and $c to show that
// they don't need to be named $x, $y and $z
function getXYZ(&$a, &$b, &$c)
{
    $a = 4;
    $b = 5;
    $c = 6;
}

getXYZ($x, $y, $z);

이 기술은 (예를 들어, PHP에 의해 정의 된 몇몇 기능에 사용 $count않는 str_replace , $matches내의 는 preg_match ). 이것은 여러 값을 반환하는 것과는 상당히 다른 느낌이 들지만 적어도 알 가치가 있습니다.

세 번째 방법은 객체를 사용하여 필요한 다른 값을 유지하는 것입니다. 이것은 더 많은 타이핑이므로 위의 두 가지 방법만큼 자주 사용되지는 않습니다. 그러나 여러 곳에서 동일한 변수 세트를 사용하는 경우 (또는 위의 방법을 지원하지 않거나 추가 입력없이이를 수행 할 수있는 언어로 작업 할 때)이 변수를 사용하는 것이 좋습니다.

class MyXYZ
{
    public $x;
    public $y;
    public $z;
}

function getXYZ()
{
    $out = new MyXYZ();

    $out->x = 4;
    $out->y = 5;
    $out->z = 6;

    return $out;
}

$xyz = getXYZ();

$x = $xyz->x;
$y = $xyz->y;
$z = $xyz->z;

위의 방법은 함수에서 여러 값을 반환하는 주요 방법을 요약합니다. 그러나 이러한 방법에는 변형이 있습니다. 가장 흥미로운 변형은 PHP에서 배열로 할 수있는 일이 많기 때문에 실제로 배열을 반환하는 것입니다.

먼저 배열을 반환하고 배열 이외의 것으로 취급하지 않아도됩니다.

function getXYZ()
{
    return array(1,2,3);
}

$array = getXYZ();

$x = $array[1];
$y = $array[2];
$z = $array[3];

위의 코드에서 가장 흥미로운 부분은 함수 내부의 코드가 내가 제공 한 첫 번째 예제와 동일하다는 것입니다. 함수를 호출하는 코드 만 변경되었습니다. 이것은 함수가 반환하는 결과를 처리하는 방법을 함수를 호출하는 사람에게 달려 있음을 의미합니다.

또는 연관 배열을 사용할 수 있습니다.

function getXYZ()
{
    return array('x' => 4,
                 'y' => 5,
                 'z' => 6);
}

$array = getXYZ();

$x = $array['x'];
$y = $array['y'];
$z = $array['z'];

PHP에는 compact위와 동일하지만 적은 코드를 작성 하는 기능이 있습니다. (샘플에는 코드가 적지 않지만 실제 응용 프로그램은 아마도 그럴 것입니다.) 그러나 입력 절약의 양이 최소화되고 코드를 읽기가 더 어려워서 직접하지는 않을 것이라고 생각합니다. 그럼에도 불구하고 다음은 샘플입니다.

function getXYZ()
{
    $x = 4;
    $y = 5;
    $z = 6;

    return compact('x', 'y', 'z');
}

$array = getXYZ();

$x = $array['x'];
$y = $array['y'];
$z = $array['z'];

반면 compact에 대응 하는 것이 있음에 유의해야합니다 .extract 여기에 호출 코드에 사용될 수있는 것을,하지만 (특히이 같은 간단하게 뭔가를) 사용하는 나쁜 생각은 이후 심지어 그것을 위해 샘플을 제공하지 않습니다. 문제는 “매직”을 수행하고 변수를 생성하는 반면 코드의 다른 부분으로 이동하지 않고 어떤 변수가 생성되는지 확인할 수 없다는 것입니다.

마지막으로 연관 배열에서 실제로list작동하지 않는 것에 대해 언급하고 싶습니다 . 다음은 예상대로 수행됩니다.

function getXYZ()
{
    return array('x' => 4,
                 'y' => 5,
                 'z' => 6);
}

$array = getXYZ();

list($x, $y, $z) = getXYZ();

그러나 다음은 다른 작업을 수행합니다.

function getXYZ()
{
    return array('x' => 4,
                 'z' => 6,
                 'y' => 5);
}

$array = getXYZ();

list($x, $y, $z) = getXYZ();

// Pay attention: $y == 6 && $z == 5

list연관 배열과 함께 사용 하고 다른 사람이 미래에 호출 된 함수의 코드를 변경 해야하는 경우 (어떤 상황에서도 발생할 수 있음) 갑자기 중단 될 수 있으므로 list연관 배열 과 결합하지 않는 것이 좋습니다 .


답변

귀하의 예에서 두 번째 반환은 발생하지 않습니다-첫 번째 반환은 PHP가 마지막으로 실행하는 것입니다. 여러 값을 반환해야하는 경우 배열을 반환하십시오.

function test($testvar) {

    return array($var1, $var2);
}

$result = test($testvar);
echo $result[0]; // $var1
echo $result[1]; // $var2


답변

PHP 7.1부터 우리는 리스트를 적절히 파괴 했습니다. 따라서 다음과 같은 작업을 수행 할 수 있습니다.

$test = [1, 2, 3, 4];
[$a, $b, $c, $d] = $test;
echo($a);
> 1
echo($d);
> 4

함수에서 이것은 다음과 같습니다.

function multiple_return() {
    return ['this', 'is', 'a', 'test'];
}

[$first, $second, $third, $fourth] = multiple_return();
echo($first);
> this
echo($fourth);
> test

파괴는 매우 강력한 도구입니다. 키 => 값 쌍을 파괴 할 수도 있습니다.

["a" => $a, "b" => $b, "c" => $c] = ["a" => 1, "b" => 2, "c" => 3];

PHP 7.1의 새로운 기능 페이지를 살펴보십시오.

새로운 기능


답변

PHP 5.5에는 새로운 개념이 있습니다 : generators, 함수에서 여러 값을 얻을 수 있습니다 :

function hasMultipleValues() {
    yield "value1";
    yield "value2";
}

$values = hasMultipleValues();
foreach ($values as $val) {
    // $val will first be "value1" then "value2"
}


답변

또는 참조로 전달할 수 있습니다.

function byRef($x, &$a, &$b)
{
    $a = 10 * $x;
    $b = 100 * $x;
}

$a = 0;
$b = 0;

byRef(10, $a, $b);

echo $a . "\n";
echo $b;

이것은 출력

100
1000


답변

나는 꽤 늦었다는 것을 알고 있지만이 문제에 대한 훌륭하고 간단한 해결책이 있습니다.
파괴를 사용하여 한 번에 여러 값을 반환 할 수 있습니다.

function test()
{
    return [ 'model' => 'someValue' , 'data' => 'someothervalue'];
}

이제 이것을 사용할 수 있습니다

$result = test();
extract($result);

extract해당 멤버의 이름을 따서 배열의 각 멤버에 대한 변수를 만듭니다. 당신은 그러므로 지금에 액세스 할 수 있습니다 $model$data