Rumah  >  Soal Jawab  >  teks badan

fungsi kembali beberapa kali

Adakah mungkin untuk mempunyai fungsi dengan dua nilai pulangan seperti ini:

function test($testvar)
{
  // Do something

  return $var1;
  return $var2;
}

Jika ya, bagaimana saya boleh mendapatkan setiap pulangan secara berasingan?

P粉022285768P粉022285768182 hari yang lalu306

membalas semua(2)saya akan balas

  • P粉548512637

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

    Secara teknikal, anda tidak boleh mengembalikan berbilang nilai. Walau bagaimanapun, terdapat cara untuk mengatasi had ini. Cara paling serupa untuk mengembalikan berbilang nilai adalah dengan menggunakan kata kunci 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)

    Secara teknikal, anda mengembalikan tatasusunan dan menggunakan list untuk menyimpan elemen tatasusunan itu dengan nilai yang berbeza, dan bukannya menyimpan tatasusunan sebenar. Menggunakan teknik ini akan menjadikannya terasapaling seperti mengembalikan berbilang nilai.

    list Penyelesaiannya adalah khusus php. Sesetengah bahasa mempunyai struktur yang serupa, tetapi banyak lagi yang tidak. Terdapat kaedah lain yang biasa digunakan untuk "mengembalikan" berbilang nilai, dan tersedia dalam hampir setiap bahasa (dalam satu cara atau yang lain). Walau bagaimanapun, pendekatan ini kelihatan berbeza sama sekali, jadi ia mungkin memerlukan sedikit masa untuk membiasakan diri.

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

    Teknik ini juga digunakan dalam beberapa fungsi yang ditakrifkan oleh PHP itu sendiri (cth. str_replace, $matches dalam preg_match$matches). Ini mungkin terasa sangat berbeza daripada mengembalikan berbilang nilai , tetapi ia berbaloi pada paling tidak mengetahuinya

    .

    Kaedah ketiga ialah menggunakan objek untuk memegang nilai berbeza yang anda perlukan. Ini memerlukan lebih banyak input, jadi ia digunakan kurang kerap daripada dua kaedah di atas. Namun, mungkin masuk akal untuk menggunakan ciri ini apabila set pembolehubah yang sama digunakan di berbilang tempat (atau, sudah tentu, dalam bahasa yang tidak menyokong kaedah di atas atau membenarkan anda melakukannya tanpa menaip tambahan).

    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;

    Kaedah di atas meringkaskan cara utama untuk fungsi mengembalikan berbilang nilai. Walau bagaimanapun, terdapat beberapa variasi pada kaedah ini. Varian yang paling menarik ialah yang sebenarnya mengembalikan tatasusunan, kerana anda boleh melakukan banyak perkara dengan tatasusunan dalam PHP.

    Pertama, kita hanya boleh mengembalikan tatasusunan tanpa menganggapnya sebagai sesuatu selain tatasusunan:

    function getXYZ()
    {
        return array(1,2,3);
    }
    
    $array = getXYZ();
    
    $x = $array[0];
    $y = $array[1];
    $z = $array[2];

    Bahagian yang paling menarik dari kod di atas ialah kod di dalam fungsi adalah sama seperti dalam contoh pertama yang saya berikan hanya kod yang memanggil fungsi itu telah berubah. Ini bermakna bahawa apa yang dilakukan oleh pemanggil fungsi dengan hasil yang dikembalikan oleh fungsi adalah terpulang kepada orang yang memanggil fungsi itu.

    Sebagai alternatif, anda boleh menggunakan tatasusunan bersekutu:

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

    Php mempunyai fungsi compactcompact yang membolehkan anda melakukan perkara yang sama seperti di atas tetapi kurang menulis kod. (Nah, contoh tidak akan mempunyai kurang kod, tetapi aplikasi dunia nyata mungkin akan melakukannya.) Walau bagaimanapun, saya fikir penjimatan menaip adalah minimum, dan ia menjadikan kod lebih sukar untuk dibaca, jadi saya tidak akan melakukannya sendiri. Walau bagaimanapun, berikut adalah contoh:

    function getXYZ()
    {
        $x = 4;
        $y = 5;
        $z = 6;
        
        return compact('x', 'y', 'z');
    }
    
    $array = getXYZ();
    
    $x = $array['x'];
    $y = $array['y'];
    $z = $array['z'];

    Perlu diambil perhatian bahawa walaupun compactcompactextract mempunyai rakan sejawat dalam extract

    yang boleh digunakan dalam kod panggilan di sini, kerana menggunakannya adalah idea yang tidak baik (terutamanya untuk sesuatu yang semudah perkara ini), Saya tidak akan memberikan sampelnya. Masalahnya ialah, ia "secara ajaib" mencipta pembolehubah untuk anda, dan anda tidak dapat melihat pembolehubah yang dibuat tanpa melihat bahagian lain kod. 🎜

    Akhir sekali, saya ingin menyatakan bahawa list tidak berfungsi dengan baik dengan tatasusunan bersekutu. Kandungan berikut akan memenuhi jangkaan anda:

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

    Walau bagaimanapun, perkara berikut akan melakukan sesuatu yang berbeza:

    function getXYZ()
    {
        return array('x' => 4,
                     'z' => 6,
                     'y' => 5);
    }
    
    $array = getXYZ();
    
    list($x, $y, $z) = getXYZ();
    
    // Pay attention: $y == 6 && $z == 5

    Jika anda menggunakan list 与关联数组一起使用,并且其他人将来必须更改被调用函数中的代码(这可能发生在任何情况下),它可能会突然中断,所以我建议不要将 list dengan tatasusunan bersekutu, dan orang lain perlu menukar kod dalam fungsi yang dipanggil pada masa hadapan (ini boleh berlaku dalam apa jua keadaan), ia mungkin pecah secara tiba-tiba, jadi saya syorkan untuk tidak menggunakan

    dengan tatasusunan tatasusunan bersekutu . 🎜

    balas
    0
  • P粉717595985

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

    Tidak boleh mengembalikan 2 pembolehubah. Walau bagaimanapun, anda boleh menyebarkan tatasusunan dan mengembalikannya;

    Sebagai contoh, fungsi ini akan kembali $var2

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

    Dalam apl:

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

    Kalau nak kedua-duanya boleh ubah suai fungsi sikit

    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

    balas
    0
  • Batalbalas