Frage

Ich bin zu bemerken, dass die gehören das Hinzufügen Pfad eines Ordners Ich brauche nicht genug, um die Klassen zuzugreifen.

Ich habe einen Ordner application / Tests / die Anwendung enthält / Tests / test.php

Klasse test.php wird dem Namen Test ohne Präfixe

class Test {

}

Wenn ich hinzufügen, die Tests Ordner nur in dem Pfad enthalten

realpath(APPLICATION_PATH . '/tests')

Die Klasse test.php nicht in dem Controller funktioniert

new Test()

so nicht mit dem Ordner, in der Include-Pfad genug?

War es hilfreich?

Lösung

@StasM hat es richtig. Aber hier ist ein wenig mehr Erklärung.

Die include_path sagt PHP, wo sie suchen, wenn sie eine include ausführt, eine include_once, eine require oder ein require_once. Natürlich verweisen diese includes und requires immer eine bestimmte Datei .

Autoloading ist speziell über fehlende Klassen . Wenn eine bis jetzt noch unbelastete Klasse in Code verwiesen wird - in der Regel, aber nicht ausschließlich, durch den new Operator aufrufen, wie in Ihrem Beispiel - dann selbstladende ist ein Prozess, der mit einem Algorithmus zum Laden der Klasse tritt in kann. Dieser Prozess umfasst in der Regel aus dem Namen der fehlenden Klasse beginnen und eine Sammlung von möglichen Pfadnamen produzieren - entweder absolut im Dateisystem oder in Bezug auf Einträge in der include_path - aus dem Namen der fehlenden Klasse und dann eine include in der Hoffnung zu tun durchführen, die die Klassendefinition befindet sich in einer von ihnen.

In Ihrem Fall haben Sie für eine Klasse mit dem Namen „Test“ genannt. Die Datei, die diese Klasse enthält, befindet sich in der Datei APPLICATION_PATH . 'tests/Test.php'. Und Sie haben das Verzeichnis APPLICATION_PATH . 'tests' im include_path platziert. Aber bis es ein automatischer Laden Algorithmus vorhanden, gibt es keine Möglichkeit für das System der Klassennamen 'Test' den Dateinamen 'Test.php' zu verbinden.

Die PEAR-Stil Klassennamen Konvention würde diese Verbindung zur Verfügung stellen. Und ein Autoloader, der diese Konvention beschäftigt - wie der Standard Zend Framework Autoloader -. Wäre in der Lage, dass die Zuordnung von Klassennamen Dateinamen durchzuführen, und dann include die gewünschte Datei

Als letzte Komplikation, die herkömmlichen Zend Framework Verzeichnisstruktur Konvention Orte bestimmte Klassen in Ordnern, die nicht auf dem Include-Pfad: Modelle, Formen, Dienstleistungen, Controller, View Helfer, Action Helfer, usw. . das ist ja Sie werden oft mehr Konfiguration des Autoloaders sehen - in der Regel in der Bootstrap Klasse - eine Zuordnung zwischen bestimmten Klassennamen und bestimmten Orten im Dateisystem zu definieren, die off die include_path.

Zum Beispiel wird eine Klasse mit dem Namen ‚Default_Model_User‘ Macht - auf dem ersten Blick - zu erwarten, auf dem include_path in einer Datei 'Default/Model/User.php' wohnen. Aber die Standard-App-Verzeichnisstruktur will diese Datei platzieren in ‚application / models / User.php‘. Beachten Sie den Plural 'Modelle' und die Klein 'm' im Pfadnamen, sowie das Vorhandensein von "Default" in dem Klassennamen. Extra-Config auf dem Autoloader erforderlich ist, um Sinn davon zu machen, bieten die ein Muster für die Klassennamen-to-Dateinamenzuordnung. Dies wird in der Regel erreicht mit einer Ressource Autoloader .

Hope irgendetwas davon hilft, entweder Sie oder jemand anderes. Cheers!

Andere Tipps

Fügen Sie Pfad zeigt, wo PHP für Scripte aussehen würde, dass es im Begriff ist aufzunehmen - so dass, wenn Sie include('blah.php') PHP-Engine sagen für blah.php in allen Pfaden in der Include-Pfad aussehen würde.

Autoloading ist die Funktionalität, die bestimmte Funktion kann aufgerufen werden, wenn PHP erkennt, dass Klasse benötigt wird, aber nicht definiert. In dieser Funktion können Sie den Include-Pfad verwenden, um die Datei mit der Klasse und laden sie zu finden, aber diese sind völlig verschiedene Dinge.

realpath() ist nicht auf irgendwelche von denen im Zusammenhang und ist eine Funktion, dass die Renditen einzigartige Dateisystem-Pfad einer bestimmten Datei, mit Dingen wie .. und symbolische Links aufgelöst.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top