PHP8.1 ciri baharu menjelaskan penghitungan Enums

藏色散人
Lepaskan: 2023-02-17 12:10:01
asal
4927 orang telah melayarinya

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!

Label berkaitan:
sumber:php.cn
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan