Heim > Fragen und Antworten > Hauptteil
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
而不更改任何这些文件(这将成为维护负担),这样 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.
P粉1896062692024-01-11 00:08:07
class_alias 本身还不够,因为为了让 P 扩展 R,两个类都必须存在。而class_alias与自动加载无关,它只是声明一个具有两个名称的类。
您实际需要的是使用新名称定义真正的类 R,然后使用名称 R 定义您自己的类(您实际上不需要 class_alias)。
一种方法是动态重写目标类的源代码,然后加载修改后的副本,如下所示(未经测试):
$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
选项设置为 true。