Rumah  >  Soal Jawab  >  teks badan

Lanjutkan kelas PHP yang digunakan secara dalaman tanpa mengubah kebergantungan

Saya ingin mengatasi kelas PHP dalam Laravel, tetapi ia sedang dilanjutkan oleh beberapa kelas lain yang saya tidak mahu ganggu. Struktur keseluruhan adalah seperti berikut

class A extends R { }
class B extends R { }
class C extends R { }
class D extends R { }

Di mana A/B/C/D/R adalah semua kelas dalam pakej luaran.

Saya ingin melanjutkan A/B/C/D ke P 而不更改任何这些文件(这将成为维护负担),这样 P 类扩展了 R。因此,我可以对 P kelas untuk ditambah.

Saya telah meneliticlass_alias(),它允许我连接到自动加载器。这会正确加载类 P.

Kod yang saya gunakan ialah:

// Some bootstrap file:
class_alias(
    P::class,
    R::class
);
// My modification:
class P extends R
{
    // ...
}

Tetapi saya mendapat ralat:

ErrorException: Tidak boleh mengisytiharkan kelas R kerana nama sudah digunakan

Saya sedang mencari penyelesaian yang boleh memanjangkan kelas PHP dalaman sambil menghalang kandungan fail penuh kelas daripada disalin. Saya tidak tahu sama ada ia boleh dilakukan. Kelas yang saya ingin lanjutkan tidak sesuai dengan bekas perkhidmatan Laravel, jadi tidak ada cara pihak pertama untuk menambah fungsi.

P粉278379495P粉278379495257 hari yang lalu311

membalas semua(1)saya akan balas

  • P粉189606269

    P粉1896062692024-01-11 00:08:07

    class_alias dengan sendirinya tidak mencukupi, kerana untuk P melanjutkan R, kedua-dua kelas mesti wujud. Dan class_alias tiada kaitan dengan autoloading, ia hanya mengisytiharkan kelas dengan dua nama.

    Apa yang anda perlukan sebenarnya ialah mentakrifkan kelas sebenar R dengan nama baharu, dan kemudian menentukan kelas anda sendiri dengan nama R (anda sebenarnya tidak memerlukan class_alias).

    Salah satu cara ialah dengan menulis semula kod sumber kelas sasaran secara dinamik dan kemudian memuatkan salinan yang diubah suai, seperti ini (belum diuji):

    $code = file_get_contents(__DIR__ . '/vendor/path/to/R.php');
    $code = str_replace('class R', 'class R_original', $code);
    eval($code);
    
    class R extends R_original {
       // Your code here
    }

    Yang penting, ini perlu dijalankan sebelum pemuat automatik biasa mencuba untuk menentukan kelas. Sebagai contoh, anda boleh menggunakan pilihan spl_autoload_register,其中 $prepend yang ditetapkan kepada benar.

    balas
    0
  • Batalbalas