Rumah pembangunan bahagian belakang PHP8 PHP8.1 ciri baharu menjelaskan penghitungan Enums

PHP8.1 ciri baharu menjelaskan penghitungan Enums

Nov 10, 2021 pm 03:09 PM
php8

Artikel ini ialah terjemahan, alamat asal: https://stitcher.io/blog/php-enums

PHP 8.1: Enumerations

Mereka akhirnya di sini – sokongan terbina dalam untuk penghitungan akan ditambah dalam PHP 8.1! Sesetengah orang mungkin fikir mereka sepatutnya melakukan ini sejak lama dahulu, tetapi anda tidak mendengar aduan saya; Artikel ini didedikasikan untuk menyelami lebih mendalam ciri yang baru ditambah.

Seperti biasa dalam siaran PHP saya, kita mulakan dengan gambaran keseluruhan peringkat tinggi tentang rupa penghitungan:

enum Status
{
    case DRAFT;
    case PUBLISHED;
    case ARCHIVED;
}
Salin selepas log masuk

Perkara yang baik tentang penghitungan ialah ia mewakili satu set pemalar values ​​, tetapi perkara yang paling penting ialah nilai boleh ditaip seperti ini:

class BlogPost
{
    public function __construct(
        public Status $status, 
    ) {}
}
Salin selepas log masuk

Dalam contoh ini, mencipta enum dan menghantarnya ke aBlogPost kelihatan seperti ini:

$post = new BlogPost(Status::DRAFT);
Salin selepas log masuk

Itu sahaja untuk asasnya, dan seperti yang anda lihat, ia tidak rumit sama sekali. Walaupun terdapat banyak nota sampingan untuk dibuat, mari kita lihat dengan lebih mendalam tentang penghitungan!

# Kaedah Penghitungan

Penghitungan boleh menentukan kaedah, sama seperti kelas. Ini adalah ciri yang sangat berkuasa, terutamanya apabila digabungkan dengan pengendali perlawanan:

enum Status
{
    case DRAFT;
    case PUBLISHED;
    case ARCHIVED;
    
    public function color(): string
    {
        return match($this) 
        {
            Status::DRAFT => 'grey',   
            Status::PUBLISHED => 'green',   
            Status::ARCHIVED => 'red',   
        };
    }
}
Salin selepas log masuk

Kaedah boleh digunakan seperti ini:

$status = Status::ARCHIVED;
$status->color(); // 'red'
Salin selepas log masuk

Kaedah statik juga dibenarkan:

enum Status
{
    // …
    
    public static function make(): Status
    {
        // …
    }
}
Salin selepas log masuk

Anda juga boleh menggunakan diri dalam penghitungan:

enum Status
{
    // …
    
    public function color(): string
    {
        return match($this) 
        {
            self::DRAFT => 'grey',   
            self::PUBLISHED => 'green',   
            self::ARCHIVED => 'red',   
        };
    }
}
Salin selepas log masuk

# Antara muka Penghitungan

Penghitungan boleh melaksanakan antara muka, seperti Sama seperti kelas biasa:

interface HasColor
{
    public function color(): string;
}
enum Status implements HasColor
{
    case DRAFT;
    case PUBLISHED;
    case ARCHIVED;
    
    public function color(): string { /* … */ }
}
Salin selepas log masuk

# Enum nilai - aka "backed enums"

Enum values ​​​​diwakili secara dalaman oleh objek, tetapi anda boleh Berikan nilai kepada mereka seperti yang diperlukan; ini berguna untuk cth. Sirikan mereka ke dalam pangkalan data.

enum Status: string
{
    case DRAFT = 'draft';
    case PUBLISHED = 'published';
    case ARCHIVED = 'archived';
}
Salin selepas log masuk

Perhatikan pengisytiharan jenis dalam definisi penghitungan. Ia menunjukkan bahawa semua nilai penghitungan tergolong dalam jenis yang diberikan. Anda juga boleh menjadikannya int. Ambil perhatian bahawa onlyint dan rentetan dibenarkan sebagai nilai penghitungan.

enum Status: int
{
    case DRAFT = 1;
    case PUBLISHED = 2;
    case ARCHIVED = 3;
}
Salin selepas log masuk

Istilah teknikal untuk jenis enum dipanggil "bilangan bersandar" kerana ia "disokong" oleh nilai yang lebih mudah. Jika anda memutuskan untuk memberikan nilai penghitungan, semua kes harus mempunyai nilai. Anda tidak boleh mencampur dan memadankannya. Enumerasi tanpa "backing" dipanggil "pure enumeration".

# Enum yang disandarkan dengan antara muka

Jika anda menggabungkan enum yang disokong dengan antara muka, jenis enum mesti datang terus selepas nama enum, dilaksanakan sebelum kata kunci.

enum Status: string implements HasColor
{
    case DRAFT = 'draft';
    case PUBLISHED = 'published';
    case ARCHIVED = 'archived';
    
    // …
}
Salin selepas log masuk

# Pensirian disokong enum

Jika anda memberikan nilai kepada kes enum, anda mungkin memerlukan cara untuk mensiri dan menyahsirikannya mengubahnya. Mensirikannya bermakna anda memerlukan cara untuk mengakses nilai enum. Ini dilakukan melalui sifat awam baca sahaja:

$value = Status::PUBLISHED->value; // 2
Salin selepas log masuk

Penghitungan boleh dipulihkan daripada nilai menggunakan: Enum::from

$status = Status::from(2); // Status::PUBLISHED
Salin selepas log masuk

Jika nilai yang tidak diketahui diluluskan tryFrom, Terdapat juga satu yang mengembalikan null. Terdapat pengecualian jika anda menggunakan daripada.

$status = Status::from('unknown'); // ValueError
$status = Status::tryFrom('unknown'); // null
Salin selepas log masuk

Perhatikan bahawa anda juga boleh menggunakan fungsi bersiri dan menyahsiri terbina dalam pada penghitungan. Selain itu, anda boleh menggunakan json_encode dengan penghitungan yang disokong dan hasilnya akan menjadi nilai penghitungan. Tingkah laku ini boleh diatasi dengan melaksanakan JsonSerializable.

# Senarai nilai penghitungan

Anda boleh menggunakan kaedah statik untuk mendapatkan senarai semua kes yang tersedia dalam penghitungan: Enum::cases()

Status::cases();
/* [
    Status::DRAFT, 
    Status::PUBLISHED, 
    Status::ARCHIVED
] */
Salin selepas log masuk

Perhatikan bahawa tatasusunan ini mengandungi objek penghitungan sebenar:

array_map(
    fn(Status $status) => $status->color(), 
    Status::cases()
);
Salin selepas log masuk

# Penghitungan ialah objek

Saya sudah menyebut bahawa nilai penghitungan mewakili adalah objek, sebenarnya mereka adalah objek tunggal. Ini bermakna anda boleh membandingkannya seperti ini:

$statusA = Status::PENDING;
$statusB = Status::PENDING;
$statusC = Status::ARCHIVED;
$statusA === $statusB; // true
$statusA === $statusC; // false
$statusC instanceof Status; // true
Salin selepas log masuk

# Enum sebagai kunci tatasusunan

Memandangkan nilai enum sebenarnya objek, pada masa ini Ia tidak boleh digunakan sebagai kunci tatasusunan. Perkara berikut akan mengakibatkan ralat:

$list = [
    Status::DRAFT => 'draft',
    // …
];
Salin selepas log masuk

Terdapat RFC untuk menukar gelagat ini, tetapi ia belum diundi lagi.

Ini bermakna anda hanya boleh menggunakan enum sebagai kunci dalam SplObjectStorage dan WeakMaps.

# Traits

Enumerasi boleh menggunakan trait sama seperti kelas, tetapi dengan lebih banyak sekatan. Mengatasi kaedah penghitungan terbina dalam tidak dibenarkan dan kaedah tersebut tidak boleh mengandungi atribut kelas - penggunaannya dalam penghitungan adalah dilarang.

#Reflection and Properties

Seperti yang dijangkakan, beberapa kelas refleksi telah ditambah untuk mengendalikan penghitungan: ReflectionEnum, ReflectionEnumUnitCase dan ReflectionEnumBackedCase. Terdapat juga fungsi enum_exists baharu, yang melakukan apa yang dicadangkan oleh namanya.

Sama seperti kelas dan atribut biasa, penghitungan dan kesnya boleh dianotasi menggunakan atribut. Ambil perhatian bahawa penapis TARGET_CLASS juga akan termasuk penghitungan.

Satu perkara terakhir: enum juga mempunyai sifat baca sahaja, RFC menyebut bahawa ini adalah butiran pelaksanaan dan harus digunakan hanya untuk tujuan penyahpepijatan. Tetapi ia masih patut disebut. $enum->name

Atas ialah kandungan terperinci PHP8.1 ciri baharu menjelaskan penghitungan Enums. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
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

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Tetapan grafik terbaik
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Cara Memperbaiki Audio Jika anda tidak dapat mendengar sesiapa
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Bagaimana untuk menambah sambungan mysql ke php8 Bagaimana untuk menambah sambungan mysql ke php8 Oct 07, 2023 pm 03:31 PM

Langkah-langkah untuk menambah sambungan mysql ke php8 ialah: 1. Pasang pustaka klien MySQL 2. Pasang alat pembangunan untuk PHP 8 3. Muat turun kod sumber sambungan MySQL 5. Dayakan Sambungan MySQL; 6. Mulakan Semula Hanya pelayan web.

Apakah perbezaan antara php5 dan php8 Apakah perbezaan antara php5 dan php8 Sep 25, 2023 pm 01:34 PM

Perbezaan antara php5 dan php8 adalah dari segi prestasi, struktur bahasa, sistem jenis, pengendalian ralat, pengaturcaraan tak segerak, fungsi perpustakaan standard dan keselamatan. Pengenalan terperinci: 1. Peningkatan prestasi Berbanding dengan PHP5, PHP8 mempunyai peningkatan besar dalam prestasi PHP8 memperkenalkan pengkompil JIT, yang boleh menyusun dan mengoptimumkan beberapa kod pelaksanaan frekuensi tinggi, dengan itu meningkatkan kelajuan berjalan; PHP8 memperkenalkan beberapa struktur dan fungsi bahasa baharu PHP8 menyokong parameter yang dinamakan, membenarkan pembangun menghantar nama parameter dan bukannya susunan parameter, dsb.

Penjelasan grafik terperinci tentang kaedah pemasangan dan konfigurasi apache2.4+php8.0 Penjelasan grafik terperinci tentang kaedah pemasangan dan konfigurasi apache2.4+php8.0 Dec 06, 2022 pm 04:53 PM

Artikel ini akan memperkenalkan kepada anda cara memasang apache2.4 dan cara mengkonfigurasi php8.0 Artikel disertakan dengan gambar dan langkah terperinci Mari kita lihat cara memasang dan mengkonfigurasi apache2.4+php8.0~

Bagaimana untuk menyambung ke pangkalan data dalam php8 Bagaimana untuk menyambung ke pangkalan data dalam php8 Nov 16, 2023 pm 02:41 PM

PHP8 boleh menggunakan mysqli dan PDO untuk menyambung ke pangkalan data. Pengenalan terperinci: 1. Gunakan mysqli untuk menyambung ke pangkalan data dengan memasukkan nama pelayan pangkalan data, nama pengguna, kata laluan dan nama pangkalan data untuk disambungkan. Kemudian, gunakan atribut `connect_error` untuk menyemak sama ada sambungan berjaya dan mengeluarkan mesej ralat jika sambungan gagal. Akhir sekali, tutup sambungan dengan memanggil kaedah `close()` 2. Gunakan PDO untuk menyambung ke pangkalan data, dan sambung dengan memasukkan nama pelayan pangkalan data, kata laluan dan nama pangkalan data, dsb.

Bagaimana untuk menukar jenis data php8 Bagaimana untuk menukar jenis data php8 Nov 16, 2023 pm 02:51 PM

Kaedah jenis data php8 termasuk menukar rentetan kepada integer, menukar integer kepada rentetan, menukar rentetan kepada nombor titik terapung, menukar nombor titik terapung kepada rentetan, menukar tatasusunan kepada rentetan, menukar rentetan kepada tatasusunan, menukar nilai Boolean kepada integer, penukaran integer kepada Nilai boolean dan penentuan jenis pembolehubah dan penukaran. Pengenalan terperinci: 1. Menukar rentetan kepada integer termasuk fungsi intval() dan (int) penukaran jenis paksa 2. Menukar integer kepada rentetan termasuk fungsi strval() dan (rentetan) penukaran jenis paksa; rentetan kepada apungan Mata dan sebagainya.

Pandangan mendalam tentang JIT dalam PHP 8 Pandangan mendalam tentang JIT dalam PHP 8 Apr 25, 2022 pm 08:46 PM

Artikel ini akan membawa anda melalui JIT dalam PHP 8 dan bercakap tentang cara JIT mengambil bahagian dalam proses tafsiran saya harap ia akan membantu semua orang.

Apakah peningkatan prestasi yang ada pada php8? Apakah peningkatan prestasi yang ada pada php8? Dec 21, 2023 pm 02:44 PM

Peningkatan prestasi php8 termasuk: 1. Pengenalan pengkompil JIT; 2. Pengoptimuman panggilan fungsi; . Memperbaik pemprosesan tatasusunan; 8. Memperkenalkan mekanisme pengurusan memori baharu; Pengenalan terperinci: 1. Pengenalan pengkompil JIT PHP8 memperkenalkan pengkompil JIT, yang merupakan teknologi kompilasi dinamik yang boleh menukar kod PHP kepada kod mesin untuk pelaksanaan yang lebih cekap, dsb.

Apakah ciri yang ada pada php8? Apakah ciri yang ada pada php8? Dec 21, 2023 pm 02:54 PM

Ciri-ciri php8: 1. Pengkompil JIT; 3. Jenis kesatuan; ; 10. Penambahbaikan konsisten. Pengenalan terperinci: 1. Pengkompil JIT, PHP8 memperkenalkan teknologi kompilasi tepat dalam masa, yang menyusun kod PHP ke dalam kod mesin asli, dengan itu meningkatkan kelajuan pelaksanaan program 2. Parameter yang dinamakan, PHP8 menyokong parameter yang dinamakan, membenarkan penggunaan nama parameter semasa memanggil fungsi dll.

See all articles