Erstens, das ist ein bisschen lang, also danke fürs Lesen.
Mein Problem ist ähnlich wie dieses: Klasse nicht in derselben Datei gefunden
Ich habe ein maßgeschneidertes Framework, das ursprünglich 2008 für PHP 5 geschrieben wurde und im Laufe der Jahre aktualisiert wurde, um mit PHP 5.3 zu arbeiten. Ich habe die 5.4-Kompatibilität untersucht und ein ernstes Problem festgestellt.
Die ORM-Schicht generiert automatisch Klassen für jede DB-Tabelle. Diese Klassen befinden sich alle in einer Datei pro Tabelle und unser Autoloader lädt diese Datei bei Bedarf. Zum Beispiel hätte eine "Kunden" -Tabelle im öffentlichen Schema (postgresql) die folgenden Klassen: PublicCustomer, ÖffentlicherCustomerDBReader, PublicCustomerDBWriter. Nun, das ist vielleicht nicht das ideale Setup, aber es ist das, was wir momentan haben.
Wenn in PHP 5.3 PublicCustomer erforderlich war, wurde die Datei einbezogen, analysiert und alle der oben genannten Klassen wurden verfügbar. Wenn also zum Beispiel eine statische Methode für PublicCustomer aufgerufen wird und diese Methode etwas in PublicCustomerDBReader aufruft, würde das funktionieren, da sich diese Klasse in derselben Datei befindet.
In PHP 5.4 sieht es so aus, als ob einige Optimierungen im Kern vorgenommen wurden. Im obigen Szenario:
Eine statische Methode wird in PublicCustomer aufgerufen.
Der Autoloader sucht und lädt die richtige Datei.
Der PHP-Parser analysiert nur dort, wo er gebraucht wird; die PublicCustomer-Klasse. Es hat die PublicCustomerDBReader-Klasse nicht analysiert oder instanziiert. Ich kann dies bestätigen, indem ich überprüfe, ob die Klasse existiert und ob der Parser das Ende der Datei erreicht, wenn sie eingeschlossen wird, wenn die Methode aufgerufen wird (tut es nicht).
Es scheint mir, dass ich zwei Lösungen habe:
Habe ich das obige Problem richtig verstanden?
Weiß jemand, ob eine Optimierung oder Änderung in PHP 5.4 dieses Verhalten verursacht hat?
Gibt es andere mögliche Lösungen für das Problem, die ich nicht berücksichtigt habe?
Platzieren Sie die Reader / Writer-Klassen am Anfang der Datei. Sie könnten auch einen Fehlerbericht einreichen, da der Parser nur bei Fehlern anhalten sollte.
Mit Bezug auf die PHP Framework Interop Group und ihre Autoloading-Standards PSR-0 und PSR-4 Jede Klasse muss ihre eigene Datei mit einem Namen haben, der auf .php
endet. Selbst wenn Sie Tausende von Klassen haben, sollte dies kein Problem für das Dateisystem sein.
Bei mehr als einer Klasse in einer Datei müssen folgende Aspekte berücksichtigt werden:
Tags und Links php