Bolehkah saya mencipta alias untuk keseluruhan ruang nama dalam PHP?
P粉252423906
P粉252423906 2024-01-16 12:23:30
0
1
333

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粉252423906
P粉252423906

membalas semua(1)
P粉613735289

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"
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!