Beispiele für die Verwendung von Namespaces in PHP. Namespaces in PHP, erklärt. Namespaces: Mehrere Beschreibungsbereiche

Ich habe kürzlich mein Projekt in einem Namespace gekapselt und bin auf das Problem einer unzureichenden Dokumentation gestoßen. Alles, was wir finden konnten, stammt aus dem Jahr 2009, also fast aus dem Jahr 2012 ... In dem gefundenen Material gibt es viele nicht funktionierende Stellen, die etwas verwenden, das nicht in der aktuellen PHP-Version enthalten ist. In diesem Zusammenhang möchte ich etwas Licht ins Dunkel bringen.
Was ist also ein Namespace oder Namespace? Die große Wikipedia definiert sie so:

Namespace ist eine Menge, d. h. ein Modell, ein abstrakter Speicher oder eine Umgebung, die für die logische Gruppierung eindeutiger Bezeichner (d. h. Namen) erstellt wurde. Ein in einem Namespace definierter Bezeichner ist diesem Namespace zugeordnet. Derselbe Bezeichner kann unabhängig voneinander in mehreren Bereichen definiert werden. Daher kann ein Wert, der mit einem in einem Namensraum definierten Bezeichner verknüpft ist, dieselbe (oder vielmehr eine andere) Bedeutung haben wie derselbe Bezeichner, der in einem anderen Namensraum definiert ist (oder auch nicht). Namespace-fähige Sprachen definieren Regeln, die angeben, zu welchem ​​Namespace ein Bezeichner gehört (d. h. seine Definition).wiki

Alles klar? Es ist eigentlich einfach. Vor Version 5.3 gab es in PHP nur zwei Leerzeichen – global (in dem Ihr Hauptcode ausgeführt wurde) und lokal (in dem Funktionsvariablen definiert wurden).

Seit Version 5.3 hat sich alles geändert. Jetzt können Sie Ihren Namensraum definieren, in dem Ihre Klassen, Methoden usw. existieren.


Ich hoffe, es ist etwas klarer geworden.

Ich habe die Klassen ausdrücklich gleich benannt. Da sie in unterschiedlichen Räumen definiert sind, handelt es sich trotz der gleichen Namen um zwei verschiedene Klassen. Das Hauptskript funktioniert weiterhin im globalen Raum, hier hat sich nichts geändert und es können weiterhin Klassen und Funktionen darin definiert werden. Wozu dienen dann Räume? Stellen Sie zunächst sicher, dass Ihre Klassen die Klassen des Frameworks nicht überschreiben oder umgekehrt, wenn Sie eine Datei in ein Framework oder eine Bibliothek einbinden.

Um in Ihrem Namensraum definierte Klassen zu verwenden, müssen Sie den von Ihnen definierten Raum an der richtigen Stelle in den globalen Raum importieren (normalerweise mache ich das lieber am Anfang der Datei). Verwenden Sie dazu das Schlüsselwort „use“.

Aufmerksamkeit: Aus irgendeinem Grund erlaubt PHP die Verwendung des Schlüsselworts nicht verwenden in Bedingungsblöcken und Schleifen

Nehmen wir das Beispiel aus den Bildern und implementieren es in Code:

Aufmerksamkeit: Das Namespace-Schlüsselwort muss sich ganz am Anfang der Datei befinden, unmittelbar danach
Datei A.php
B.php-Datei
Eine alternative Syntax ist möglich:
Es wird empfohlen, jeden Namespace in einer separaten Datei zu deklarieren. Obwohl es in einem möglich ist, wird es strikt nicht empfohlen!
Gehen wir nun zur dritten Datei über, in der unser Hauptskript funktionieren wird
index.php
Es scheint, dass dies ein Vorteil ist, es wird nur mehr Code hinzugefügt, aber das stimmt nicht ganz. Etwas weiter unten werde ich ein Beispiel für eine Autoload-Klasse geben, bei der die Zeilen, die Dateien mit Klassen verbinden, unnötig sind.
Schauen wir uns nun unsere Kurse an.

Aufmerksamkeit: Verwendung des Bereichsauflösungsoperators (::) in PHP-Namespaces nicht erlaubt! Es eignet sich lediglich für den Zugriff auf statische Klassenmethoden und -konstanten. Zunächst wollte man es für den Namensraum nutzen, entschied sich dann aber aufgrund aufgetretener Probleme dagegen. Daher ist eine Konstruktion wie A::A::say(); ist ungültig und führt zu einem Fehler.

Für Namespaces müssen Sie das Backslash-Zeichen „\“ verwenden.
Aufmerksamkeit: Um Missverständnisse zu vermeiden, ist es notwendig, dieses Zeichen bei Verwendung in Zeichenfolgen zu maskieren: „\\“

Namespaces können ineinander verschachtelt werden. Fügen wir unserer A.php-Datei Folgendes hinzu:
und in den Index schreiben wir Folgendes:

Ein wichtiger Punkt ist die Verwendung von Aliasnamen für importierte Leerzeichen. Sie könnten A\subA::say(); Sie werden zustimmen, dass es schwierig ist, jedes Mal vollständige Pfade zu Leerzeichen zu schreiben. Um dies zu vermeiden, wurden Aliase eingeführt. Beim Kompilieren passiert Folgendes: Anstelle des Alias ​​sub wird A\subA ersetzt, sodass wir den Aufruf A\subA::say(); erhalten.

Was passiert dann, wenn im globalen Raum definierte Funktionen aufgerufen werden? PHP sucht zunächst in dem Bereich, in dem Sie gerade arbeiten, nach einer Funktion. Wenn es diese nicht findet, wechselt es in den globalen Bereich. Um sofort anzuzeigen, dass Sie eine globale Funktion verwenden, müssen Sie ihr einen Backslash voranstellen.

Um Probleme beim automatischen Laden von Klassen aus Spaces zu vermeiden, muss das Dateisystem ähnlich wie Spaces organisiert sein. Wenn wir beispielsweise einen Stammordner „classes“ haben, in dem unsere Klassen gespeichert werden, können unsere Räume wie folgt organisiert werden
Klassen\A\A.php
classes\A\sub\A.php (subsubspace wird in einer separaten Datei abgelegt)
Klassen\B\B.php

PHP verfügt über eine magische Konstante __NAMESPACE__, die den Namen des aktuellen Bereichs enthält.

Und nun zum automatischen Laden.

Die folgende Klasse gehört nicht mir, ich habe sie nur zum Laufen gebracht und ein wenig verbessert, übernommen von hier.
Aufmerksamkeit: Damit Ihre Klassen geladen werden, muss der Klassenname mit dem Dateinamen übereinstimmen!

„ .$file .“ in " .$filepath)); if (file_exists($filepath)) ( if(Autoloader::debug) Autoloader::StPutFile(("connected " .$filepath)); $flag = FALSE; require_once($filepath); break; ) Autoloader::recursive_autoload($file, $path2, &$flag); ) ) geschlossenir($handle); ) ) private statische Funktion StPutFile($data) ( $dir = $_SERVER["DOCUMENT_ROOT"] ." /Log/Log.html"; $file = fopen($dir, "a"); flock($file, LOCK_EX); fwrite($file, ("║" .$data ."=>" .date(" d.m.Y H:i:s") ."

" .PHP_EOL)); flock($file, LOCK_UN); fclose ($file); ) ) \spl_autoload_register("yourNameSpace\Autoloader::autoload"); )
Wenn Sie sich die Namen der zum Laden eingehenden Klassen ansehen, werden Sie feststellen, dass jeder Klasse ein Präfix aus dem Namensraum vorangestellt ist, der in Verwendung angegeben ist. Aus diesem Grund empfehle ich, den Speicherort von Dateien in Verzeichnissen zu verwenden, die dem Namespace ähneln; dies beschleunigt die Suche auf ein oder zwei Iterationen.

Nun kann unser Index so geschrieben werden:
Jetzt werden alle Klassen und Schnittstellen, die Sie verwenden werden, automatisch geladen.

Um einige der dynamischen Fähigkeiten der Sprache mit Leerzeichen zu demonstrieren, deklarieren wir eine andere Klasse:
test.php

Index.php
sayName("test"); //oder Sie können diesen Test durchführen\sayName("test2"); //oder so $obj::sayName("test"); //oder Sie können diesen Test durchführen::sayName("test2");

Ich hoffe, dass mein Artikel für jemanden nützlich sein wird.

PHP gab uns ab Version 5.3 Namespaces. Seitdem gab es einige schleppende und einige hitzige Diskussionen darüber, wie dieser Namensraum verwendet werden soll.
Einige Frameworks wie Symphony, Laravel und natürlich Zend haben diese Technologie übernommen.
All dies passt mehr oder weniger in das MVC-Schema. Es bleibt eine, wahrscheinlich ewige Debatte: Was sollte das Hauptpaar der Anwendung sein – Model und Controller?
Einige sagen uns, dass das Model stämmig und fett sein sollte und mit ihr ein schlanker und dünner Controller. Mit einem Wort: Matriarchat.
Andere hingegen glauben, dass der Controller alles verwalten und befehlen muss, damit er sich als solide und wohlgenährt erweist. Und mit ihm ist ein dünnes, schlankes Model, dessen Aufgabe darin besteht, zu geben und zu bringen. Das ist Patriarchat.
Was ist also im MVC-Schema besser? Patriarchat oder Matriarchat?
Betrachten wir dies aus der Perspektive des Aufbaus einer Familieneinheit auf der Grundlage der Demokratie. Und lassen Sie uns dabei von Namespace helfen.

Wir mögen keine dicken, klobigen Controller, die wie ein Bulle im Porzellanladen bei Unachtsamkeit die gesamte Anwendung zerstören können.
Wir mögen auch keine dicken Models. Nun, wer mag sie? Sie müssen dem Podium würdig sein!
Versuchen wir, mit Hilfe von Namespace, wie mit einem guten Heiratsvermittler, eine harmonische Familie zu schaffen.

Lassen Sie uns zunächst das Anwendungsframework erstellen. So banal es auch sein mag, lass es ein Blog sein.

Wir haben eine Grundstruktur erstellt, in der:

  • Blog ist der Speicher unserer Anwendung.
  • Ansichten und Vorlagen – Speicherung von Ansichten und Vorlagen;
  • Dienstprogramm – Repository gemeinsam genutzter Bibliotheken;
  • index.php – Bootstrap-Skript;
  • Post – hier soll die Familienidylle des Controllers und des Models stattfinden.

Mit index.php ist alles einfach:

laufen(); /* * Ende von index.php */

Wir ermitteln die notwendigen Pfade und erstellen einen Autoloader.
Der Autoloader lädt die benötigten Klassen, die sich entsprechend dem Klassennamensraum in einer Ordnerhierarchie befinden. Beispielsweise würde die Klasse „BlogPostServicesView“ in „Blog/Post/Services“ gesucht werden.
Und hier ist das erste Treffen mit Namespace.
Wenn wir index.php starten, erstellen wir eine Instanz der Blog-Anwendung, deren Klasse aus Blog/Blog.php geladen wird.
Schauen wir ihn uns an.

post = neuer Beitrag(); ) öffentliche Funktion run() ( $this->post->view->all(); ) )//end class Blog

Beim Erstellen der Blog-Klasse fügen wir eine Post-Klasse mit dem Namespace BlogPost ein und der Autoloader lädt sie aus Blog/Post/Post.php.
Wahrscheinlich kann diese Klasse als Controller bezeichnet werden.

view = new View(); ) )//Klassenbeitrag beenden

Die Post-Entität umfasst:
- die Struktur des Datensatzes selbst - BlogPostEntitiesPostEntity.php

Dienste, die Controller-Anfragen bedienen – BlogPostServicesView.php (z. B. einer der Dienste)

db = neuer DB(); )//end __construct public function all() ( $posts = $this->db->survey(); Contemplate::compose(array("header" => "header", "main" => "main", "footer" => "footer",), array("posts" => $posts, "title" => "Viper site",)); ) )//end class PostView

Das Datenbankinteraktionssystem – BlogPostRepositoriesDB.php – hier ist es, unser schlankes, elegantes Modell,
Geben Sie es einfach, bringen Sie es mit und nichts weiter!

dbh = new PDO("mysql:host=localhost;dbname=test", $user, $pass, array(PDO::ATTR_PERSISTENT => true)); ) Catch (PDOException $e) ( echo "Error!: " . $e->getMessage() . "
"; die(); ) )//end __construct public function Survey() ( $query_view = $this->dbh->prepare("SELECT * from posts"); $query_view->execute(); return $query_view- >fetchAll(PDO::FETCH_CLASS, "BlogPostEntitiesPostEntity"); )//Umfrage beenden )//Klasse Db beenden

Dadurch konnten wir eine Anwendungsstruktur schaffen, in der alle Komponenten gut miteinander verbunden sind, und gleichzeitig eine klare Klassentrennung erreichen, bei der jede Klasse ihre eigene Aufgabe erfüllt. Unser Controller ist dünn und gleichzeitig leistungsstark. Das Modell passt zu ihm. Perfekte Familie!
Und das alles dank Namespace.

Ich behaupte nicht, dass der Rahmen in vielen Fällen praktisch ist. Aber schauen Sie, Namespace erinnert Sie an nichts?
Eine klare Einteilung in Klassen, eine strenge und zugleich flexible Hierarchie von Verzeichnissen und Klassen, völlig dem Entwickler untergeordnet.
Manchmal gibt es kein so bedeutendes Add-on in Form von Hunderten von Dateien und Klassen in Form eines Frameworks.
Das Fehlen eines prokrusteischen Regelwerks für die Interaktion von Klassen und Komponenten.

Der Artikel wurde von Gedanken zu diesem Thema von Taylor Otwell, dem Autor des Laravel-Frameworks, inspiriert, wofür ihm vielen Dank gilt.
Adresse des Beispielquellcodes auf GitHub.

Guten Tag. Im heutigen Artikel werden wir uns damit befassen, Was sind Namespaces in PHP?.

Wenn Sie es schon längere Zeit verwenden OOP, dann sind Sie wahrscheinlich auf eine Situation gestoßen, in der beim Anschließen einer Bibliothek eines Drittanbieters ein Fehler aufgetreten ist, weil Sie in Ihrem Code bereits dieselben Klassennamen wie in der Bibliothek verwenden. Dies kann insbesondere dann passieren, wenn Sie gebräuchliche Namen wie verwenden "Modell", „db“ usw. Ich werde Ihnen jetzt sagen, wie Sie das beheben können.

Namensraum- Dies ist eine Art Speicher, der für die abstrakte Gruppierung eindeutiger Bezeichner (Namen) erstellt wurde.

Diese. wenn du benutzt Namensräume, dann können Sie Bibliotheken von Drittanbietern sicher anschließen und müssen keine Angst haben, dass sie dieselben Namen wie in Ihrem Code haben. Lassen Sie uns mit der Theorie abschließen und mit der Praxis fortfahren.

Lassen Sie uns eine Datei erstellen myclass.php mit diesem Inhalt

Namespace my\oneProject;
Klasse MyClass ( )
?>

Hier haben wir eine Klasse im Namespace erstellt mein\oneProject. Übrigens müssen Sie den Backslash genau schreiben. Lassen Sie sich nicht verwirren!

Jetzt in der Akte index.php lass uns Folgendes schreiben

require_once("myclass.php");
$mc = new MyClass(); // Fehler: Klasse nicht gefunden
$mc = new my\oneProject\MyClass(); // alles arbeitet
?>

Wie Sie sehen, ist es jetzt nicht mehr möglich, einfach so eine Klasse zu erstellen, Sie müssen angeben, in welcher Klasse Namensraum er liegt.

Wir können mehrere gleichzeitig angeben Namensräume in einer Datei

Namespace-Projekt;

Const CONNECT_OK = 1;
Klasse Connection ( )
Funktion connect() ( )

NamespaceAnotherProject;

Const CONNECT_OK = 1;
Klasse Connection ( )
Funktion connect() ( )
?>

Trotz der Tatsache, dass wir absolut identische Namen von Klassen, Funktionen und Konstanten haben, wird es keinen Namenskonflikt geben, weil sie liegen in verschiedenen Räumen.

Wir können auch die Klammersyntax verwenden.

Namespace-Projekt (

Const CONNECT_OK = 1;
Klasse Connection ( )
Funktion connect() ( )
}

Namespace AnotherProject (

Const CONNECT_OK = 1;
Klasse Connection ( )
Funktion connect() ( )
}
?>

Wenn Sie den Code in kombinieren globaler Namensraum Bei Code an anderen Stellen wird nur die Syntax mit Klammern verwendet.

Namespace-Projekt (

Const CONNECT_OK = 1;
Klasse Connection ( )
Funktion connect() ( )
}

Namespace ( // globaler Code
session_start();
$a = Projekt\connect();
echo Project\Connection::start();
}
?>

Vergessen Sie außerdem nicht, dass die Definition eines Namespace immer die erste Codezeile sein sollte. Wenn Sie so schreiben, kommt es zu einem Fehler

Um herauszufinden, in welchem ​​Namensraum Sie sich gerade befinden, können Sie die Konstante verwenden __NAMESPACE__

Namespace-Projekt;
echo „“, __NAMESPACE__, „““; // gibt „Projekt“ aus
?>

Mit dieser Konstante können Sie beispielsweise Namen dynamisch konstruieren

Namespace-Projekt;

Funktion inkl($classname) (
$a = __NAMESPACE__ . "\\" . $Klassenname;
neues $a zurückgeben;
}
?>

Das ist also alles für heute. Weitere Informationen und praktisches Wissen erhalten Sie durch die Teilnahme am Kurs

Ich habe kürzlich mein Projekt in einem Namespace gekapselt und bin auf das Problem einer unzureichenden Dokumentation gestoßen. Alles, was wir finden konnten, stammt aus dem Jahr 2009, also fast aus dem Jahr 2012 ... In dem gefundenen Material gibt es viele nicht funktionierende Stellen, die etwas verwenden, das nicht in der aktuellen PHP-Version enthalten ist. In diesem Zusammenhang möchte ich etwas Licht ins Dunkel bringen.
Was ist also ein Namespace oder Namespace? Die große Wikipedia definiert sie so:

Namespace ist eine Menge, d. h. ein Modell, ein abstrakter Speicher oder eine Umgebung, die für die logische Gruppierung eindeutiger Bezeichner (d. h. Namen) erstellt wurde. Ein in einem Namespace definierter Bezeichner ist diesem Namespace zugeordnet. Derselbe Bezeichner kann unabhängig voneinander in mehreren Bereichen definiert werden. Daher kann ein Wert, der mit einem in einem Namensraum definierten Bezeichner verknüpft ist, dieselbe (oder vielmehr eine andere) Bedeutung haben wie derselbe Bezeichner, der in einem anderen Namensraum definiert ist (oder auch nicht). Namespace-fähige Sprachen definieren Regeln, die angeben, zu welchem ​​Namespace ein Bezeichner gehört (d. h. seine Definition).wiki

Alles klar? Es ist eigentlich einfach. Vor Version 5.3 gab es in PHP nur zwei Leerzeichen – global (in dem Ihr Hauptcode ausgeführt wurde) und lokal (in dem Funktionsvariablen definiert wurden).

Seit Version 5.3 hat sich alles geändert. Jetzt können Sie Ihren Namensraum definieren, in dem Ihre Klassen, Methoden usw. existieren.


Ich hoffe, es ist etwas klarer geworden.

Ich habe die Klassen ausdrücklich gleich benannt. Da sie in unterschiedlichen Räumen definiert sind, handelt es sich trotz der gleichen Namen um zwei verschiedene Klassen. Das Hauptskript funktioniert weiterhin im globalen Raum, hier hat sich nichts geändert und es können weiterhin Klassen und Funktionen darin definiert werden. Wozu dienen dann Räume? Stellen Sie zunächst sicher, dass Ihre Klassen die Klassen des Frameworks nicht überschreiben oder umgekehrt, wenn Sie eine Datei in ein Framework oder eine Bibliothek einbinden.

Um in Ihrem Namensraum definierte Klassen zu verwenden, müssen Sie den von Ihnen definierten Raum an der richtigen Stelle in den globalen Raum importieren (normalerweise mache ich das lieber am Anfang der Datei). Verwenden Sie dazu das Schlüsselwort „use“.

Aufmerksamkeit: Aus irgendeinem Grund erlaubt PHP die Verwendung des Schlüsselworts nicht verwenden in Bedingungsblöcken und Schleifen

Nehmen wir das Beispiel aus den Bildern und implementieren es in Code:

Aufmerksamkeit: Das Namespace-Schlüsselwort muss sich ganz am Anfang der Datei befinden, unmittelbar danach
Datei A.php
B.php-Datei
Eine alternative Syntax ist möglich:
Es wird empfohlen, jeden Namespace in einer separaten Datei zu deklarieren. Obwohl es in einem möglich ist, wird es strikt nicht empfohlen!
Gehen wir nun zur dritten Datei über, in der unser Hauptskript funktionieren wird
index.php
Es scheint, dass dies ein Vorteil ist, es wird nur mehr Code hinzugefügt, aber das stimmt nicht ganz. Etwas weiter unten werde ich ein Beispiel für eine Autoload-Klasse geben, bei der die Zeilen, die Dateien mit Klassen verbinden, unnötig sind.
Schauen wir uns nun unsere Kurse an.

Aufmerksamkeit: Verwendung des Bereichsauflösungsoperators (::) in PHP-Namespaces nicht erlaubt! Es eignet sich lediglich für den Zugriff auf statische Klassenmethoden und -konstanten. Zunächst wollte man es für den Namensraum nutzen, entschied sich dann aber aufgrund aufgetretener Probleme dagegen. Daher ist eine Konstruktion wie A::A::say(); ist ungültig und führt zu einem Fehler.

Für Namespaces müssen Sie das Backslash-Zeichen „\“ verwenden.
Aufmerksamkeit: Um Missverständnisse zu vermeiden, ist es notwendig, dieses Zeichen bei Verwendung in Zeichenfolgen zu maskieren: „\\“

Namespaces können ineinander verschachtelt werden. Fügen wir unserer A.php-Datei Folgendes hinzu:
und in den Index schreiben wir Folgendes:

Ein wichtiger Punkt ist die Verwendung von Aliasnamen für importierte Leerzeichen. Sie könnten A\subA::say(); Sie werden zustimmen, dass es schwierig ist, jedes Mal vollständige Pfade zu Leerzeichen zu schreiben. Um dies zu vermeiden, wurden Aliase eingeführt. Beim Kompilieren passiert Folgendes: Anstelle des Alias ​​sub wird A\subA ersetzt, sodass wir den Aufruf A\subA::say(); erhalten.

Was passiert dann, wenn im globalen Raum definierte Funktionen aufgerufen werden? PHP sucht zunächst in dem Bereich, in dem Sie gerade arbeiten, nach einer Funktion. Wenn es diese nicht findet, wechselt es in den globalen Bereich. Um sofort anzuzeigen, dass Sie eine globale Funktion verwenden, müssen Sie ihr einen Backslash voranstellen.

Um Probleme beim automatischen Laden von Klassen aus Spaces zu vermeiden, muss das Dateisystem ähnlich wie Spaces organisiert sein. Wenn wir beispielsweise einen Stammordner „classes“ haben, in dem unsere Klassen gespeichert werden, können unsere Räume wie folgt organisiert werden
Klassen\A\A.php
classes\A\sub\A.php (subsubspace wird in einer separaten Datei abgelegt)
Klassen\B\B.php

PHP verfügt über eine magische Konstante __NAMESPACE__, die den Namen des aktuellen Bereichs enthält.

Und nun zum automatischen Laden.

Die folgende Klasse gehört nicht mir, ich habe sie nur zum Laufen gebracht und ein wenig verbessert, übernommen von hier.
Aufmerksamkeit: Damit Ihre Klassen geladen werden, muss der Klassenname mit dem Dateinamen übereinstimmen!

„ .$file .“ in " .$filepath)); if (file_exists($filepath)) ( if(Autoloader::debug) Autoloader::StPutFile(("connected " .$filepath)); $flag = FALSE; require_once($filepath); break; ) Autoloader::recursive_autoload($file, $path2, &$flag); ) ) geschlossenir($handle); ) ) private statische Funktion StPutFile($data) ( $dir = $_SERVER["DOCUMENT_ROOT"] ." /Log/Log.html"; $file = fopen($dir, "a"); flock($file, LOCK_EX); fwrite($file, ("║" .$data ."=>" .date(" d.m.Y H:i:s") ."

" .PHP_EOL)); flock($file, LOCK_UN); fclose ($file); ) ) \spl_autoload_register("yourNameSpace\Autoloader::autoload"); )
Wenn Sie sich die Namen der zum Laden eingehenden Klassen ansehen, werden Sie feststellen, dass jeder Klasse ein Präfix aus dem Namensraum vorangestellt ist, der in Verwendung angegeben ist. Aus diesem Grund empfehle ich, den Speicherort von Dateien in Verzeichnissen zu verwenden, die dem Namespace ähneln; dies beschleunigt die Suche auf ein oder zwei Iterationen.

Nun kann unser Index so geschrieben werden:
Jetzt werden alle Klassen und Schnittstellen, die Sie verwenden werden, automatisch geladen.

Um einige der dynamischen Fähigkeiten der Sprache mit Leerzeichen zu demonstrieren, deklarieren wir eine andere Klasse:
test.php

Index.php
sayName("test"); //oder Sie können diesen Test durchführen\sayName("test2"); //oder so $obj::sayName("test"); //oder Sie können diesen Test durchführen::sayName("test2");

Ich hoffe, dass mein Artikel für jemanden nützlich sein wird.

(PHP 5 >= 5.3.0, PHP 7)

Bevor wir die Verwendung von Namespaces besprechen, ist es wichtig zu verstehen, woher PHP weiß, welches Namespace-Element Ihr Code anfordert. Es kann eine einfache Analogie zwischen PHP-Namespaces und einem Dateisystem gezogen werden. Es gibt drei Möglichkeiten, auf eine Datei in einem Dateisystem zuzugreifen:

  1. Relativer Dateiname wie foo.txt. Dies löst sich auf aktuelles Verzeichnis/foo.txt Dabei ist currentdirectory das aktuell belegte Verzeichnis. Also, wenn das aktuelle Verzeichnis ist /home/foo, der Name wird aufgelöst /home/foo/foo.txt.
  2. Relativer Pfadname wie Unterverzeichnis/foo.txt. Dies löst sich auf aktuelles Verzeichnis/Unterverzeichnis/foo.txt.
  3. Absoluter Pfadname wie /main/foo.txt. Dies löst sich auf /main/foo.txt.
Das gleiche Prinzip kann auf Namespace-Elemente in PHP angewendet werden. Beispielsweise kann auf einen Klassennamen auf drei Arten verwiesen werden:
  1. Nicht qualifizierter Name oder ein Klassenname ohne Präfix wie $a = new foo(); oder foo::staticmethod(); aktuellerNamespace, das löst sich auf aktuellerNamespace\foo foo. Eine Einschränkung: Nicht qualifizierte Namen für Funktionen und Konstanten werden in globale Funktionen und Konstanten aufgelöst, wenn die Namespace-Funktion oder -Konstante nicht definiert ist. Weitere Informationen finden Sie unter Verwenden von Namespaces: Fallback auf globale Funktion/Konstante.
  2. Qualifizierter Name oder ein vorangestellter Klassenname wie z $a = neuer Unternamespace\foo(); oder subnamespace\foo::staticmethod();. Wenn der aktuelle Namespace ist aktuellerNamespace, das löst sich auf aktuellerNamespace\Subnamespace\foo. Wenn es sich bei dem Code um globalen Code ohne Namespace handelt, wird dies aufgelöst subnamespace\foo.
  3. Vollqualifizierter Name oder ein vorangestellter Name mit einem globalen Präfixoperator wie z $a = new \currentnamespace\foo(); oder \currentnamespace\foo::staticmethod();. Dies wird immer in den im Code angegebenen Literalnamen aufgelöst. aktuellerNamespace\foo.

Hier ist ein Beispiel für die drei Arten von Syntax im tatsächlichen Code:

Namespace Foo\Bar\subnamespace;

const FOO = 1 ;
Funktion foo()()
Klasse foo
{
}
?>

Namespace Foo\Bar;
Include „file1.php“ ;

const FOO = 2;
Funktion foo()()
Klasse foo
{
statische Funktion staticmethod()()
}

/* Unqualifizierter Name */
foo(); foo::staticmethod(); echo FOO ;

/* Qualifizierter Name */
subnamespace\foo(); // wird in die Funktion Foo\Bar\subnamespace\foo aufgelöst
subnamespace\foo::staticmethod(); // wird in die Klasse Foo\Bar\subnamespace\foo aufgelöst,
// Methode staticmethod
echo subnamespace\FOO; // wird in die Konstante Foo\Bar\subnamespace\FOO aufgelöst

/* Vollqualifizierter Name */
\foo\bar\foo(); // wird in die Funktion Foo\Bar\foo aufgelöst
\foo\bar\foo::staticmethod(); // wird in die Klasse Foo\Bar\foo, Methode staticmethod, aufgelöst
echo\Foo\Bar\FOO; // wird in die Konstante Foo\Bar\FOO aufgelöst
?>

Beachten Sie, dass für den Zugriff auf globale Klassen, Funktionen oder Konstanten ein vollständig qualifizierter Name verwendet werden kann, z \strlen() oder \Ausnahme oder \INI_ALL. ?>