Ich habe eine Datei mit einer Klasse Resp
. Der Weg ist:
C:\xampp\htdocs\One\Classes\Resp.php
Und ich habe eine index.php
Datei in diesem Verzeichnis:
C:\xampp\htdocs\Two\Http\index.php
In dieser index.php
Datei möchte ich eine Klasse instanziieren Resp
.
$a = new Resp();
Ich weiß, dass ich require
oder include
Schlüsselwörter verwenden kann, um die Datei in eine Klasse aufzunehmen:
require("One\Classes\Resp.php"); // I've set the include_path correctly already ";C:\xampp\htdocs". It works.
$a = new Resp();
Aber ich möchte Klassen importieren, ohne require
oder zu verwenden include
. Ich versuche zu verstehen, wie use
Keyword funktioniert. Ich habe diese Schritte ausprobiert, aber nichts funktioniert:
use One\Classes\Resp;
use xampp\htdocs\One\Classes\Resp;
use htdocs\One\Classes\Resp;
use One\Classes;
use htdocs\One\Classes; /* nothing works */
$a = new Resp();
Es sagt:
Fatal error: Class 'One\Classes\Resp' not found in C:\xampp\htdocs\Two\Http\index.php
Wie funktioniert das Keyword use
? Kann ich damit Klassen importieren?
namespace
s. In der Tat gibt es keine Symfony, wenn Sie keine Namespaces verwendenAntworten:
use
beinhaltet nichts. Es wird nur der angegebene Namespace (oder die angegebene Klasse) in den aktuellen Bereich importiertWenn Sie möchten, dass die Klassen automatisch geladen werden, lesen Sie mehr über das automatische Laden
quelle
Nein, Sie können keine Klasse mit dem
use
Schlüsselwort importieren . Sie müsseninclude
/require
Anweisung verwenden. Selbst wenn Sie einen PHP-Auto-Loader verwenden, muss der Autoloader entwederinclude
oderrequire
intern verwendet werden.Das Schlüsselwort für den Verwendungszweck :
Stellen Sie sich einen Fall vor, in dem Sie zwei Klassen mit demselben Namen haben. Sie werden es seltsam finden, aber wenn Sie mit einer großen MVC-Struktur arbeiten, passiert es. Wenn Sie also zwei Klassen mit demselben Namen haben, platzieren Sie sie in unterschiedlichen Namespaces. Überlegen Sie nun, wann Ihr Auto Loader beide Klassen lädt (bis
require
) und Sie im Begriff sind, ein Objekt der Klasse zu verwenden. In diesem Fall wird der Compiler verwirrt, welches Klassenobjekt unter zwei geladen werden soll. Um dem Compiler zu helfen, eine Entscheidung zu treffen, können Sie dieuse
Anweisung verwenden, damit er eine Entscheidung treffen kann, für welche verwendet werden soll.Heutzutage verwenden große Frameworks
include
oderrequire
viacomposer
undpsr
1) Komponist
2) PSR-4 Autoloader
Das Durchgehen kann Ihnen weiterhelfen. Sie können auch einen Alias verwenden, um eine genaue Klasse zu adressieren. Angenommen, Sie haben zwei Klassen mit demselben Namen, beispielsweise
Mailer
mit zwei verschiedenen Namespaces:und
Wenn Sie beide Mailer-Klassen gleichzeitig verwenden möchten, können Sie einen Alias verwenden.
Wenn Sie später in Ihrem Code auf diese Klassenobjekte zugreifen möchten, können Sie Folgendes tun:
Es wird auf die ursprüngliche Klasse verweisen.
Einige können verwirrt sein, dass es dann keine ähnlichen Klassennamen gibt, dann gibt es keine Verwendung von
use
Schlüsselwörtern. Nun, Sie können eine__autoload($class)
Funktion verwenden, die automatisch aufgerufen wird, wenn dieuse
Anweisung mit der Klasse ausgeführt wird, die als Argument verwendet werden soll. Dies kann Ihnen dabei helfen, die Klasse bei Bedarf sofort zur Laufzeit zu laden.In dieser Antwort erfahren Sie mehr über den Klassen-Autoloader.
quelle
use
Anweisung sagt, dass der Compiler dies jetzt für mich lädt. Verstanden, Schatz!Überdenken Sie nicht, was ein Namespace ist.
Der Namespace ist im Grunde nur ein Klassenpräfix (wie das Verzeichnis im Betriebssystem), um die Eindeutigkeit des Klassenpfads sicherzustellen .
Um die Dinge klarer zu machen, führt die use- Anweisung nicht nur ein Aliasing Ihrer Namespaces durch, sodass Sie Verknüpfungen verwenden oder Klassen mit demselben Namen, aber unterschiedlichen Namespace in dieselbe Datei aufnehmen können.
Z.B:
Wenn Sie wissen möchten, wie PHP-Namespaces und das automatische Laden (sowohl der alte als auch der neue Weg mit Composer) funktionieren, können Sie den Blog-Beitrag lesen, den ich gerade zu diesem Thema geschrieben habe: https://enterprise-level-php.com/ 2017/12/25 / die Magie hinter dem automatischen Laden von PHP-Dateien mit Composer.html
quelle
Sie müssen die Klasse trotzdem einschließen / benötigen, sonst weiß PHP nichts über den Namespace.
Sie müssen dies jedoch nicht in derselben Datei tun . Sie können dies beispielsweise in einer Bootstrap-Datei tun. (oder verwenden Sie einen Autoloader, aber das ist eigentlich nicht das Thema)
quelle
Das Problem ist höchstwahrscheinlich, dass Sie einen Auto Loader verwenden müssen, der den Namen der Klasse (in diesem Fall durch '\' unterbrechen) verwendet und einer Verzeichnisstruktur zuordnet.
Sie können diesen Artikel über das automatische Laden lesen Funktionalität von PHP . Es gibt bereits viele Implementierungen dieser Art von Funktionalität in Frameworks.
Ich habe tatsächlich schon einmal einen implementiert. Hier ist ein Link .
quelle
Ich stimme Green zu, Symfony benötigt einen Namespace. Warum also nicht?
So beginnt eine Beispiel-Controller-Klasse:
quelle
Sie können es nicht so machen, außer den obigen Beispielen. Sie können das Schlüsselwort auch
use
in Klassen verwenden, um Merkmale wie folgt zu importieren :quelle
Das
use
Schlüsselwort dient zum Aliasing in PHP und importiert die Klassen nicht. Dies hilft wirklich1) Wenn Sie Klassen mit demselben Namen in verschiedenen Namespaces haben
2) Vermeiden Sie es, immer wieder sehr lange Klassennamen zu verwenden.
quelle
Der Namespace wird verwendet, um den Pfad zu einer bestimmten Datei zu definieren, die eine Klasse enthält, z
Sie können diese bestimmte Klasse dann in eine andere PHP-Datei aufnehmen, indem Sie das Schlüsselwort "use" wie folgt verwenden:
ANMERKUNG: Verwenden Sie nicht den Pfad zu der Datei, die die zu implementierende Klasse enthält, sondern erweitern Sie die Verwendung, um ein Objekt zu instanziieren, sondern verwenden Sie nur den Namespace.
quelle
Die Verwendung des Schlüsselworts "use" dient zum Kürzen von Namespace-Literalen. Sie können sowohl mit als auch ohne Aliasing verwenden. Ohne Aliasing müssen Sie den letzten Teil des vollständigen Namespace verwenden.
quelle