cari

Rumah  >  Soal Jawab  >  teks badan

Bolehkah saya mencipta alias untuk keseluruhan ruang nama dalam PHP?

Bolehkah saya mencipta alias ruang nama menggunakan fungsi PHP 8.1 (seperti nama kategori)?

Kami menamakan modul ruang nama lalai dalam Syarikat "Syarikat Kecil" dan mahu ia menjadi "Syarikat" sekarang memandangkan penggunaannya telah berkembang.

Jawapan yang sempurna ialah mempunyai sedikit overhed yang mungkin dan membenarkan pemuatan auto telus. Satu masalah ialah alat seperti Intelephense akan memahami alias ini.

Projek ini juga menggunakan Komposer, jadi jawapan untuk menulis semula ruang nama menggunakannya juga akan berfungsi.

P粉252423906P粉252423906314 hari yang lalu390

membalas semua(1)saya akan balas

  • P粉613735289

    P粉6137352892024-01-17 11:10:42

    Ya, dan fikirkan: class_alias telah diperkenalkan dengan PHP 5.3 dengan ciri bahasa ruang nama baharunya. Ia dicipta untuk memudahkan pemindahan daripada ruang nama global kepada ruang nama - sebenarnya antara ruang nama.

    Walau bagaimanapun, anda perlu terlebih dahulu mendaftarkan nama kelas untuk setiap kelas/antara muka/sifat/penghitungan lama kepada rakan sejawat baharu.

    My\Old\Lib\Name\Module\Submodule\Interface
    My\Tiger\Lib\Name\Module\Submodule\Interface

    Perpustakaan lama sudah tiada dan kini terdapat perpustakaan Harimau yang serba baharu. Semua kelas mereka dsb. boleh dipetakan dengan menukar awalan ruang nama ('MyOldLibName' -> 'MyTigerLibName').

    Ini boleh dilakukan pada masa jalan kerana PHP melakukan kebanyakan kerja untuk anda.

    Daftar pemuat auto yang dimuatkan sebagai awalan ruang nama baharu berdasarkan awalan ruang nama lama dan tambahkan nama kategori kepada nama lama.

    Contoh:

    spl_autoload_register(
        static function (string $class_name) {
            static $old = 'My\Old\Lib\Name\';
            static $new = 'My\Tiger\Lib\Name\';
    
            // only operate on the old namespace
            if (0 !== strpos($class_name, $old)) {
                return;
            }
            $new_name = substr_replace($class_name, $new, 0, strlen($old));
            class_alias($new_name, $class_name);
            $exists = class_exists($new_name);
        },
        $throw = true,   /* throw when registering fails */
        $prepend = false /* only alias at fall-through */
    );
    

    Kod ini sangat mudah, hanya dua penjelasan pada parameter pendaftaran:

    1. $throw = true: Apabila alias autoloader gagal mendaftar, anda ingin menghentikan aplikasi serta-merta, jika tidak, anda akan mendapat ralat "kelas tidak dijumpai" yang pelik kemudian.
    2. $prepend = false: Panggilan balik hanya perlu dipanggil jika masih terdapat kod menggunakan nama kelas lama. Oleh itu, kod standard kini didahulukan menggunakan ruang nama baharu dan pemuatan automatik standard.

    Mungkin perlu diberi perhatian ialah bahagian class_exists():

            $exists = class_exists($new_name);
    

    Jika kelas baharu belum dimuatkan lagi, ia akan mencetuskan autoloading.

    Selepas mendaftarkan autoloader, kod lama akan memuatkan kelas baharu secara automatik di bawah alias lama.

    use My\Old\Lib\Name\Module\Boring;
    
    $boring = new Boring();
    assert($boring instanceof My\Old\Lib\Name\Module\Boring);
    var_dump(get_class($boring)); # string(31) "My\Tiger\Lib\Name\Module\Boring"
    

    balas
    0
  • Batalbalas