PHP 5.4 vs 5.3: Autoloading mehrerer Klassen in der gleichen Datei

8

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:

  1. Eine statische Methode wird in PublicCustomer aufgerufen.

  2. Der Autoloader sucht und lädt die richtige Datei.

  3. 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).

  4. Die Methode in PublicCustomer versucht dann, eine Methode in PublicCustomerDBReader aufzurufen. Dies schlägt fehl, da unser Autoloader die Datei bereits einmal benötigt hat.

Es scheint mir, dass ich zwei Lösungen habe:

  1. Trennen Sie diese Klassen voneinander, so dass es jeweils eine Datei gibt (dadurch wird eine große Anzahl von Dateien erzeugt)
  2. Redesign der ORM-Schicht, so dass mehrere Klassen nicht benötigt werden.

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?

    
user2353938 06.05.2013, 09:02
quelle

2 Antworten

1

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.

    
Ryan Yoosefi 11.05.2013 15:24
quelle
0

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:

  • Für jede Klasse muss der Autoloader entscheiden, welche Datei geladen werden soll. Wenn Sie mehrere Klassen in einer Datei haben, verursacht jede verwendete Klasse eine Auslastung. Klassendateien sollten einmal und nicht mehr geladen werden, da Klassen nicht neu deklariert werden können. Ich empfehle es nicht, aber Sie könnten dies mit Ihrem eigenen Autoloader, der geladene Dateien oder Tests für geladene Klassen erinnert.
  • Klassen, die in derselben Datei platziert sind und sich gegenseitig verwenden, sind problematisch. Das Problem wird in Abgeleitete Klasse später in der gleichen Datei definiert "existiert nicht"? und beantwortet von Jon .
Henrik 26.11.2014 21:35
quelle

Tags und Links