Rumah >pembangunan bahagian belakang >PHP8 >PHP8.1 ciri-ciri baru menjelaskan pemula pemula

PHP8.1 ciri-ciri baru menjelaskan pemula pemula

藏色散人
藏色散人asal
2021-11-10 15:19:243032semak imbas

Artikel ini ialah terjemahan, alamat asal: https://stitcher.io/blog/php-81-new-in-initializers

PHP 8.1: Initializer ( baharu dalam pemula)

PHP 8.1 menambah butiran yang kelihatan kecil, tetapi saya fikir ia akan memberi kesan hari ke hari yang ketara kepada ramai orang. Jadi tentang apa "Apa yang baharu dalam Initializer RFC" ini? Mari lihat contoh; kita semua telah menulis kod seperti ini:

class MyStateMachine
{
    public function __construct(
        private ?State $state = null,
    ) {
        $this->state ??= new InitialState();
    }
}

Dalam contoh mesin keadaan ini, kami mahu menstruktur kelas kami dalam dua cara: dengan dan tanpa keadaan awal. Jika kita membinanya tanpa keadaan awal, kita mahu menetapkan keadaan lalai. PHP pastinya menyokong penetapan nilai awal secara langsung dalam senarai parameter, tetapi hanya untuk jenis primitif. Sebagai contoh, jika mesin keadaan kita menggunakan rentetan secara dalaman dan bukannya objek, kita boleh menulis pembinanya seperti ini:

class MyStateMachine
{
    public function __construct(
        private string $state = 'initial',
    ) {
    }
}

Jadi, dalam PHP 8.1, kita juga boleh menggunakan perkara yang sama untuk objek "nilai lalai" sintaks. Dalam erti kata lain: anda boleh menggunakan parameter lalai baharu (ini ialah contoh "pemula":

class MyStateMachine
{
    public function __construct(
        private State $state = new InitialState(),
    ) {
    }
}

"Pemula" bukan sekadar lalai parameter, berikut ialah penjelasan ringkas daripada RFC :

RFC ini mencadangkan untuk membenarkan ungkapan baharu dalam lalai parameter, parameter sifat, pemula pembolehubah statik dan pemula pemalar global

Anda membacanya dengan betul: Hartanah juga terdapat dalam senarai ini! Bayangkan perpustakaan pengesahan mudah yang menggunakan atribut untuk mengesahkan input kepada sifat. Mungkin ia sepatutnya dapat mengesahkan elemen tatasusunan seperti ini:

class CreateEmailsRequest extends FormRequestData
{
    #[ValidArray(
        email: [new Required, new ValidEmail],
        name: [new Required, new ValidString],
    )]
    public array $people;
}

Sebelum PHP 8.1 anda tidak akan dapat menulis kod tersebut kerana anda tidak dibenarkan menggunakan atribut baharu kerana sifatnya dinilai, Tetapi sekarang anda boleh!

Mari kita lihat beberapa butiran penting yang patut disebut.

Adakah anda ingin mengetahui lebih lanjut tentang PHP 8.1? Terdapat laluan ke PHP 8.1. Untuk 10 hari seterusnya, anda akan menerima e-mel harian tentang ciri baharu dan sedia ada PHP 8.1, anda kemudiannya akan dinyahlanggan secara automatik supaya anda tidak akan menerima e-mel spam atau susulan. Langgan sekarang!

#Bina hanya apabila diperlukan

"Nilai baharu" ini hanya akan dibina apabila benar-benar diperlukan. Ini bermakna, dalam contoh pertama kami, InitialState hanya akan mencipta objek baharu jika tiada hujah diberikan:

class MyStateMachine
{
    public function __construct(
        private State $state = new InitialState(),
    ) {
    }
}
new MyStateMachine(new DraftState()); // No InitialState is created
new MyStateMachine(); // But now it is

Sebagai contoh, dalam kes sifat, hanya newInstance akan Objek dibuat hanya apabila dipanggil .

# Tiada dalam atribut kelas

Anda juga harus tahu bahawa baharu tidak boleh digunakan sebagai nilai lalai dalam atribut kelas. Menyokong ciri ini memperkenalkan beberapa kesan sampingan yang tidak dijangka, contohnya, apabila mensiri dan menyahsiri objek.

class MyStateMachine
{
    private State $state = new InitialState();
}

Nasib baik, kami mempunyai sifat angkat yang membenarkan nilai lalai, kerana PHP akan menukar sintaks angkat harta untuk meninggalkan nilai lalai dalam parameter pembina, tetapi bukan dalam harta sebenar.

Berikut ialah versi terjemahan:

class MyStateMachine
{
    private State $state;
    
    public function __construct(
        State $state = new InitialState(),
    ) {
        $this->state = $state;
    }
}

# Input terhad

Anda mungkin telah menekanya, tetapi ia dibina dalam pemula Semasa mencipta objek baru, anda hanya boleh lulus set input terhad. Sebagai contoh, anda tidak boleh menggunakan pembolehubah, pengendali penyebaran, kelas tanpa nama, dsb. Namun, ia adalah tambahan yang sangat dialu-alukan!

Atas ialah kandungan terperinci PHP8.1 ciri-ciri baru menjelaskan pemula pemula. 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