Ich m?chte eine PHP-Klasse in Laravel überschreiben, aber sie wird um mehrere andere Klassen erweitert, mit denen ich mich nicht befassen m?chte. Die Gesamtstruktur ist wie folgt
class A extends R { } class B extends R { } class C extends R { } class D extends R { }
Wobei A/B/C/D/R alle Klassen im externen Paket sind.
Ich m?chte die Klasse A/B/C/D um P
而不更改任何這些文件(這將成為維護負(fù)擔(dān)),這樣 P 類擴展了 R
。因此,我可以對 P
erg?nzen.
Ich habe recherchiertclass_alias()
,它允許我連接到自動加載器。這會正確加載類 P
.
Der Code, den ich verwendet habe, ist:
// Some bootstrap file: class_alias( P::class, R::class );
// My modification: class P extends R { // ... }
Aber ich habe den Fehler erhalten:
ErrorException: Klasse kann nicht deklariert werden
R
, da der Name bereits verwendet wird
Ich suche nach einer L?sung, die eine innere PHP-Klasse erweitern und gleichzeitig verhindern kann, dass der gesamte Dateiinhalt der Klasse kopiert wird. Ich wei? nicht einmal, ob es machbar ist. Die Klasse, die ich erweitern m?chte, passt nicht in den Laravel-Servicecontainer, daher gibt es keine Erstanbieter-M?glichkeit, Funktionalit?t hinzuzufügen.
class_alias 本身還不夠,因為為了讓 P 擴展 R,兩個類都必須存在。而class_alias與自動加載無關(guān),它只是聲明一個具有兩個名稱的類。
您實際需要的是使用新名稱定義真正的類 R,然后使用名稱 R 定義您自己的類(您實際上不需要 class_alias)。
一種方法是動態(tài)重寫目標(biāo)類的源代碼,然后加載修改后的副本,如下所示(未經(jīng)測試):
$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 }
重要的是,這需要在普通自動加載器嘗試定義類之前運行。例如,您可以使用 spl_autoload_register
,其中 $prepend
選項設(shè)置為 true。