Dengan keluaran PHP 8.0, jenis baharu telah diperkenalkan - jenis kesatuan (juga dipanggil "jenis kesatuan"), yang boleh digunakan untuk mengisytiharkan bahawa pembolehubah boleh menjadi salah satu daripada berbilang jenis.
Dalam banyak bahasa berorientasikan objek, kita boleh menggunakan konsep polimorfisme untuk menentukan bahawa pembolehubah boleh menjadi tika jenisnya sendiri, atau subjenisnya atau antara muka yang dilaksanakan Sebarang kejadian. Tetapi dalam PHP, kami hanya dapat mencapai matlamat ini dengan meletakkan beberapa jenis pernyataan bersyarat bersama-sama, termasuk dalam blok bersyarat suis, jika, dan elseif. Pendekatan ini kadangkala menyusahkan dan sukar untuk dikekalkan.
Oleh itu, PHP8.0 menambah jenis kesatuan baharu untuk mencapai polimorfisme tanpa pernyataan bersyarat. Dalam artikel ini, kami akan memperkenalkan definisi, penggunaan, sintaks dan beberapa pertimbangan jenis kesatuan.
Apabila mentakrifkan pembolehubah jenis kesatuan, anda perlu mengasingkan nama beberapa jenis dengan bar menegak (|), contohnya:
function foo(int|float|string $param) {}
Ini mentakrifkan parameter $param, yang boleh menjadi salah satu jenis integer, titik terapung atau rentetan.
Biasanya, kita juga boleh menggunakan kata kunci nol untuk menentukan bahawa pembolehubah jenis kesatuan boleh mempunyai nilai nol:
function bar(string|null $param) {}
Ini bermakna $param boleh mempunyai dua jenis berbeza: rentetan atau null.
Walau bagaimanapun, jenis kesatuan tidak menyokong definisi rekursif. Dalam erti kata lain, kita tidak boleh menggunakan sintaks berikut:
function baz(int|float|array $param, string|null|float $other) {}
Sangat mudah untuk menggunakan jenis kesatuan dalam fungsi, parameter kaedah dan jenis pulangan, sifat, dsb. Contohnya:
// 函数参数中使用union类型: function test(int|float $param) {} // 方法返回类型中使用union类型: class Foo { public function bar(): string|array {} } // 属性类型中使用union类型: class Baz { public int|float $foo; }
Walau bagaimanapun, menggunakan jenis kesatuan dalam pengisytiharan berubah agak terhad, kerana ia hanya boleh diberikan kepada nilai salah satu jenisnya.
// 变量声明中使用union类型: $test = 1|2.0|"three"; $test = "four"; // 可以赋值为其中一个类型的值 $test = false; // 不是其中任何一个类型,将会抛出TypeError
Kita boleh menggunakan is_int(), is_float(), is_string() dan fungsi lain untuk menyemak pembolehubah jenis kesatuan.
Walaupun jenis kesatuan boleh mengurangkan penyelenggaraan dan kod pendua dalam pelbagai senario, ia juga mempunyai beberapa perkara yang perlu diberi perhatian.
Pertama sekali, kita perlu menggunakan jenis kesatuan dengan berhati-hati, kerana disebabkan fleksibilitinya, ia mungkin meningkatkan kerumitan kod. Jika anda mempunyai terlalu banyak jenis kesatuan dalam kod anda, ini mungkin bermakna kod anda mungkin mempunyai masalah reka bentuk, terutamanya dengan parameter dan jenis fungsi dan kaedah yang dikembalikan.
Kedua, walaupun jenis kesatuan ialah perubahan baharu dalam PHP8.0, ia tidak disokong oleh semua versi. Jika anda ingin menggunakan jenis kesatuan, anda perlu memastikan bahawa kod anda menjalankan PHP8.0 dan ke atas, jika tidak, kod tidak akan berjalan dengan betul.
Akhir sekali, kita perlu memberi perhatian kepada sintaks penggunaan jenis kesatuan. Sintaks yang betul adalah untuk memisahkan berbilang nama jenis dengan paip (|), seperti int|float|string, bukan int|float|string atau int|float|string.
Dalam PHP8.0, jenis kesatuan baharu menyediakan kod kami penyelesaian yang lebih fleksibel dan jelas apabila menangani pertimbangan jenis kompleks memainkan peranan yang besar. Walaupun ia menepati konsep polimorfisme, kita juga mesti memberi perhatian kepada penggunaannya untuk mengelakkan penggunaan berlebihan dan kesan negatif terhadap kod tersebut. Jika anda sedang mempertimbangkan untuk menaik taraf kepada PHP8.0, anda juga boleh cuba menggunakan jenis kesatuan, mungkin ia akan menjadi pembantu yang baik untuk anda.
Atas ialah kandungan terperinci Jenis kesatuan dalam PHP8.0. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!