2016-12-10 2 views
0

In PHP habe ich eine Funktion, die Auto-Loader basierend darauf, welche Child-Site innerhalb der Parent-Site ausgewählt ist.PHP - Reset Autoload und deklarierte Klassen

Das Zurücksetzen der Auto-Loader funktioniert hervorragend mit der spl_autoload_unregister Funktion.

Was ich jedoch bemerke, ist, dass beim Laden einer Klassendatei, die bereits vor der Child-Site initiiert wurde, diese "alte" Klassendatei nach dem Zurücksetzen der Auto-Loader weiterhin verwendet wird.

Beispiel:

Eltern-Seite lädt example\namespace\RouterClass von c:\parent\site\RouterClass

Dann setzte ich alle Selbstlader und das Kind vor Ort initiieren und den richtigen Auto-Lader für das Kind vor Ort festgelegt.

Dann lädt die Child-Site example\namespace\RouterClass, aber statt diese Datei über den neuen Auto-Loader von c:\child\site\RouterClass erhält es die Klasse aus der alten Datei wie von der übergeordneten Website definiert.

Ich sehe die Klasse über die Funktion registriert:

get_declared_classes() 

Aber ich bin nicht in der Lage diese Variablenliste setzen. Wenn ein Reset dieses Klassen-Caches möglich ist, muss PHP eine neue Suche nach diesem RouterClass starten und wird den Child-Site-Auto-Loader prüfen, um es zu finden.

Zweite Option, die ich überprüft habe, war , aber es gibt keine ähnliche Funktion für Klassen wie runkit_class_redefine.

Hat jemand eine Idee, wie man die deklarierte Klassenliste zurücksetzt? Oder wie Sie das oben genannte erreichen, ohne alle Namespaces der Child-Site umzubenennen.

+0

Wenn Sie eine Datei einschließen, ist diese Datei enthalten (duh). Was musst du machen und warum? – Federkun

+0

Da können Sie dann aus Kontext innerhalb Ihres Codes ändern und mit einem Kontext in Framework v1 und mit anderem Kontext in Framework v2 arbeiten. – PeterH

Antwort

1

Nicht möglich. Sobald eine Klasse erklärt wird, ist sie für immer da.

Wenn Sie Autoloader dynamisch definieren müssen, müssen Sie dies tun, bevor eine der betroffenen Klassen geladen wird.