Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Gunakan jenis Kesatuan untuk mengisi masalah kehilangan jenis pemerolehan dalam PHP8

Gunakan jenis Kesatuan untuk mengisi masalah kehilangan jenis pemerolehan dalam PHP8

WBOY
WBOYasal
2023-06-21 10:04:391361semak imbas

Memandangkan PHP terus berkembang, ciri bahasa sentiasa dipertingkatkan dan dipertingkatkan. Dalam versi PHP8, ciri baharu telah diperkenalkan: Jenis kesatuan. Jenis kesatuan menambah sekatan jenis pada pembolehubah, parameter, nilai pulangan, dsb., yang boleh mengisi masalah kehilangan jenis dalam kod. Artikel ini akan memperkenalkan idea teras dan penggunaan jenis Kesatuan.

Apakah jenis Kesatuan?

Dalam PHP, kita selalunya perlu mengenakan sekatan jenis pada pembolehubah untuk memastikan ketepatan dan kebolehpercayaan program. Jenis kesatuan memberi kita cara baharu untuk mencapai keperluan ini.

Mari kita lihat contoh dahulu. Katakan kita mempunyai fungsi yang perlu menerima dua parameter, satu jenis int dan satu jenis rentetan:

function concatenate($a, $b) {
  return $a . $b;
}

Sekarang, kita panggil fungsi ini dan masukkan dua parameter:

concatenate(1, '2');

Hasilnya Apa itu? Jawapannya ialah: '12'. Kod ini berfungsi dengan baik, tetapi kami menghadapi kesukaran untuk mengesahkan ketepatannya. Kerana kami tidak mempunyai sekatan pada jenis parameter fungsi, iaitu, $a dan $b boleh daripada sebarang jenis.

Kita boleh menggunakan petunjuk jenis untuk meningkatkan sekatan jenis:

function concatenate(int $a, string $b) {
  return $a . $b;
}

Dengan cara ini, jika kita lulus dalam parameter jenis bukan int, ralat akan ditemui semasa fasa penyusunan. Walau bagaimanapun, terdapat masalah dengan ini: bagaimana jika kita mahu lulus dalam parameter, yang boleh jenis int atau rentetan? Anda mungkin melaksanakannya seperti ini:

function concatenate($a, $b) {
  if (is_int($a) && is_string($b)) {
    return $a . $b;
  } elseif (is_string($a) && is_int($b)) {
    return $b . $a;
  } else {
    throw new Exception('Invalid arguments');
  }
}

Cara penulisan ini sangat menyusahkan dan kebolehbacaan kod juga sangat lemah.

Dalam PHP8, kita boleh menggunakan jenis Union untuk menyelesaikan masalah ini:

function concatenate(int|string $a, int|string $b) {
  return $a . $b;
}

Fungsi ini boleh menerima dua parameter, ia boleh jenis int atau jenis rentetan, iaitu, selagi Jika jenis parameter sama ada int atau rentetan, anda boleh memanggil fungsi ini seperti biasa.

Penggunaan

Jenis kesatuan boleh digunakan dalam parameter, nilai pulangan, atribut kelas, dsb. Di bawah ini kami memperkenalkan setiap penggunaan secara berasingan.

Parameter

Jenis kesatuan boleh digunakan dalam parameter fungsi. Dengan cara ini, kita boleh mengehadkan pelbagai jenis parameter. Hanya gunakan simbol |. Contohnya:

function foo(int|float $x, string $y) {
  // ...
}

Fungsi di atas menerima dua parameter, $x boleh daripada jenis int atau float dan $y mestilah daripada jenis rentetan.

Nilai pulangan

Begitu juga, kita juga boleh menggunakan jenis Kesatuan pada nilai pulangan fungsi:

function bar(int $x): int|string {
  if ($x > 0) {
    return $x * 2;
  } else {
    return 'error';
  }
}

Fungsi ini menerima parameter jenis int $x, dan pulangan nilai boleh adalah jenis int atau rentetan. Jika $x lebih besar daripada 0, kembalikan 2 kali $x sebaliknya kembalikan rentetan 'ralat'.

Atribut kelas

Jenis kesatuan juga boleh digunakan semasa mentakrifkan atribut kelas:

class MyClass {
  public int|string $x;
}

Dalam contoh ini, MyClass mempunyai atribut $x, dan jenisnya boleh int atau jenis rentetan.

Nota

Walaupun jenis Union memberikan kita cara baharu untuk melakukan sekatan jenis, kita masih perlu memberi perhatian kepada beberapa perkara.

Pertama, gunakan jenis Kesatuan sesedikit mungkin. Sekatan jenis yang berlebihan akan mengurangkan kebolehbacaan kod dan meningkatkan kesukaran penyelenggaraan. Memilih jenis yang sesuai untuk mengehadkan parameter dan mengembalikan nilai boleh menjadikan kod anda lebih ringkas, jelas dan lebih mudah diselenggara.

Kedua, apabila menggunakan jenis Union, jenis cast harus dielakkan sebaik mungkin. Kerana ini akan menyebabkan masalah keselamatan jenis.

Akhir sekali, jenis Kesatuan bukanlah penyelesaian yang sempurna. Untuk pertimbangan jenis dalam beberapa kes, kita masih perlu menggunakan pernyataan if untuk membuat pertimbangan.

Kesimpulan

Jenis kesatuan memberi kita cara baharu sepenuhnya untuk melaksanakan sekatan jenis. Dengan menggunakan jenis Kesatuan dalam parameter, nilai pulangan dan atribut kelas, kami boleh mengawal keselamatan jenis kod kami dengan lebih ketat, dengan itu meningkatkan kebolehpercayaan dan kebolehselenggaraan program kami. Walau bagaimanapun, apabila menggunakan jenis Kesatuan, kita masih perlu memberi perhatian kepada isu seperti kebolehbacaan kod dan keselamatan jenis Hanya dengan memilih jenis yang sesuai untuk sekatan kita boleh memastikan kestabilan dan keteguhan kod.

Atas ialah kandungan terperinci Gunakan jenis Kesatuan untuk mengisi masalah kehilangan jenis pemerolehan dalam PHP8. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn