搜尋

首頁  >  問答  >  主體

函數的多次返回

是否可以有一個具有兩個回傳值的函數,如下所示:

function test($testvar)
{
  // Do something

  return $var1;
  return $var2;
}

如果是這樣,我如何分別獲得每筆回報?

P粉022285768P粉022285768241 天前488

全部回覆(2)我來回復

  • P粉548512637

    P粉5485126372024-03-26 11:41:34

    從技術上講,您不能傳回多個值。但是,有多種方法可以解決該限制。最類似傳回多個值的方式是使用 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 本身定義的一些函數中(例如str_replacepreg_match 中的$matches)。這可能感覺與返回多個值有很大不同,但至少值得了解一下。

    第三種方法是使用一個物件來保存您需要的不同值。這需要更多的輸入,因此它的使用頻率不如上面的兩種方法。不過,當在多個地方使用同一組變數時(或者當然,使用不支援上述方法或允許您無需額外鍵入即可執行此操作的語言),使用此功能可能是有意義的。

    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[0];
    $y = $array[1];
    $z = $array[2];

    上面的程式碼最有趣的部分是函數內部的程式碼與我提供的第一個範例中的程式碼相同;僅呼叫該函數的程式碼發生了變化。這意味著呼叫函數的人如何處理函數傳回的結果取決於呼叫函數的人。

    或者,可以使用關聯數組:

    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'];

    應該注意的是,雖然compactextract 中確實有一個對應項,可以在此處的呼叫程式碼中使用,但由於使用它是一個壞主意(特別是對於像這樣簡單的事情),我什至不會給出它的樣本。問題是,它會「神奇」地為您建立變量,而您如果不查看程式碼的其他部分,就無法看到創建了哪些變數。

    最後,我想提一下 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 與關聯數組結合使用陣列。

    回覆
    0
  • P粉717595985

    P粉7175959852024-03-26 09:06:04

    無法傳回 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

    回覆
    0
  • 取消回覆