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