我想重寫 Laravel 中的 PHP 類,但它正在被其他幾個(gè)我不想打擾的類別擴(kuò)展??傮w結(jié)構(gòu)如下
class A extends R { } class B extends R { } class C extends R { } class D extends R { }
其中 A/B/C/D/R 是外部套件中的所有類別。
我想將 A/B/C/D 擴(kuò)展到 P
而不更改任何這些檔案(這將成為維護(hù)負(fù)擔(dān)),這樣 P 類別擴(kuò)展了 R
。因此,我可以對(duì) P
類別進(jìn)行新增。
我一直在研究class_alias()
,它允許我連接到自動(dòng)載入器。這會(huì)正確載入類別 P
。
我使用的程式碼是:
// Some bootstrap file: class_alias( P::class, R::class );
// My modification: class P extends R { // ... }
但是我遇到了錯(cuò)誤:
ErrorException:無法宣告類別
R
,因?yàn)槊Q已在使用中
我正在尋找一種解決方案,可以擴(kuò)展內(nèi)部 PHP 類,同時(shí)防止複製類的完整文件內(nèi)容。我什至不知道是否可以做到。我想要擴(kuò)充的類別不適合 Laravel 服務(wù)容器,因此沒有第一方方法來新增功能。
class_alias 本身還不夠,因?yàn)闉榱俗?P 擴(kuò)展 R,兩個(gè)類別都必須存在。而class_alias與自動(dòng)載入無關(guān),它只是宣告一個(gè)具有兩個(gè)名稱的類別。
您實(shí)際需要的是使用新名稱定義真正的類別 R,然後使用名稱 R 定義您自己的類別(您實(shí)際上不需要 class_alias)。
一種方法是動(dòng)態(tài)重寫目標(biāo)類別的原始程式碼,然後載入修改後的副本,如下所示(未經(jīng)測(cè)試):
$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 }
重要的是,這需要在普通自動(dòng)載入器嘗試定義類別之前運(yùn)行。例如,您可以使用 spl_autoload_register
,其中 $prepend
選項(xiàng)設(shè)定為 true。