Also, wenn Sie versuchen, eine geschachtelte Klasse wie folgt zu machen:
%Vor% Sie erhalten einen Fehler Fatal error: Class declarations may not be nested in [...]
Aber wenn Sie eine Klasse in einer separaten Datei haben wie:
%Vor%Also, warum funktioniert der zweite hackige Weg, es zu tun, aber die nicht-hacky Art, es zu tun, funktioniert nicht?
Aus dem Handbuch ( Ссылка ):
Wenn eine Datei enthalten ist, geben Sie den Code ein contains erbt den Variablenbereich der Linie, auf der die enthalten sind tritt ein. Alle Variablen verfügbar unter diese Zeile in der aufrufenden Datei wird sein verfügbar in der aufgerufenen Datei, von dieser Punkt nach vorne. Allerdings alle Funktionen und Klassen definiert in der enthaltene Datei hat den globalen Gültigkeitsbereich.
Der zweite Weg besteht nicht in der Verschachtelung von Klassen. Sie haben nur Ihre beiden Deklarationen in einer Datei, die sich von Ihrem ersten Beispiel unterscheidet. In PHP können Sie mehrere Klassendeklarationen in einer Datei haben, eine organisatorische Entscheidung ist keine Voraussetzung.
Es gibt keinen guten Grund, eine Klasse innerhalb einer Methode zu definieren. Der zweite Weg "funktioniert" nur in dem Sinne, dass er keinen Fehler auslöst - die Klasse existiert immer noch im gleichen Bereich / Namespace wie alle anderen definierten Klassen. Sie verschachteln also in diesem Szenario keine Klasse.
Übrigens, der Grund dafür ist, dass eine Klasse nur eine Definition ist - es gibt keine Ausführung bei der Definition einer Klasse. Daher wird diese Datei (e.php) geparst, sobald Sie sie einschließen, und dann wird ihre Klasse für den aktuellen Ausführungskontext verfügbar. Nur die ausführbaren Teile des Codes (d. H.% Co_de%) gehören tatsächlich zum Gültigkeitsbereich des Aufrufers.
Tags und Links php nested-class