2016-07-29 23 views
2

Ich stoße auf ein paar Aromen von Laravel-Namespace-Definitionen (in den Klassen) und ich frage mich, ob einige besser als andere oder vielleicht sogar einfach falsch sind.Wie pingelig sind die Laravel-Namespaces?

  1. namespace mydomain\app\controllers
  2. namespace dev.mydomain.com\app\controllers
  3. namespace app\controllers
  4. namespace \app\controllers

Ein paar Fragen:

  • weiß, dass ich die anfängliche \ Optio ist nal, aber was ist das Mydomain-Präfix? Ist es erforderlich oder optional?
  • macht es einen Unterschied zu verwenden dev.mydomain.com ist oder nur mydomain?
  • Ist es nur eine Frage der gleichen Namen wie die Ordnernamen?
+1

Der anfängliche Schrägstrich bezieht sich auf den [globalen Namespace] (http://www.php.net/manual/en/language.namespaces.global.php). Es spielt keine Rolle, ob Sie 'dev' oder nicht vor dem Namespace verwenden. Es ist nur ein Namensraum. Ordnernamen stehen nicht im Zusammenhang mit dem Namespace, einige Loader verwenden jedoch den Namespace als Mapping für Ordner. Sehen Sie [hier] (https://daylerees.com/php-namespaces-explained/) für eine ausführlichere Erklärung. – Andrew

+0

Gibt es einen Unterschied zwischen 'myproject \ app \ controllers' und' \ app \ controllers' und 'app \ controllers'? – Maxcot

+0

Ja. Es gibt. Nach dem [psr-4] (http://www.php-fig.org/psr/psr-4/) Lade-Standard, den Laravel verwendet, muss der Namespace '\ (\ ) * sein \ 'where' SubNamespaceNames' kann beliebig sein. – Andrew

Antwort

1

Es gibt nichts besseres oder schlechteres in diesen Namespaces, die Sie erwähnen.

Namespaces wurden zur Sprache hinzugefügt, um Namenskonflikte in separaten Paketen zu verhindern.

Zum Beispiel können Sie eine Klasse User in Ihrem eigenen Namensraum haben \MyApp\User, und auch ein drittes Partei-Paket verwenden, die eine Klasse User, aber in seinem eigenen Namensraum \Package\User benannt hat.

Das war die ursprüngliche Idee. Später entschieden die Leute, dass wir diese Namespaces verwenden können, um einige Klassen automatisch zu laden. Eine rohe Idee ist, dass \MyApp\User in MyApp/User.php gefunden werden sollte. Ziemlich einfach.

Dies ist natürlich fortgeschritten, dass Sie mehr über "php autoloading" oder besser "Autoloading Composer" lesen können.

Und über diese erste \, ist es an einigen Orten nicht wichtig, aber es spielt woanders eine Rolle. Wenn ein Namespace deklariert wird, spielt es keine Rolle, z.B. namespace \MyApp\User ist das gleiche wie namespace MyApp\User. Auch die use Anweisung verhält sich so. Aber wenn Sie eine Klasse verwenden, d. H. new \MyApp\User() vs new MyApp\User, unterscheidet es sich. Sie finden weitere Informationen in PHP documentation.

Ok, genug Hintergrund. Ihre Fragen speziell.

Ich weiß, das erste \ ist optional, aber was ist das Mydomain-Präfix? Ist es erforderlich oder optional?

Wie für Laravel Fall, ist es nicht optional. Betrachten Sie composer.json, unter psr-4 finden Sie, dass der app Ordner ein definiertes Präfix für Namespace hat. Das sollten Sie für Ihre Klassen verwenden (wenn sie sich im Ordner app befinden). Um mehr zu lesen, suchen Sie nach PSR-4.

macht es einen Unterschied zu verwenden dev.mydomain.com ist oder nur mydomain?

Ich denke, ich erwähnte bereits das PSR-4, also benutze, was auch immer da ist.

Ist es nur eine Frage der gleichen Namen wie die Ordnernamen?

Das ist auch das PSR-4. Lesen Sie mehr darüber und alle Ihre Fragen werden beantwortet.

Kurz gesagt, haben wir zwei Standards für Autoloading-Klassen basierend auf Namespaces in PHP: PSR-0 und PSR-4.

In PSR-0 (die alten) hatte die Verzeichnisstruktur genau den Namensraum übereinstimmen, dass, wenn Ihr Stammordner ist src war und Du Klasse wurde \Package\User genannt, dann mußte man src/Package/User.php in Ihrem Dateisystem.

In PSR-4 können wir Namespacepräfix für ein Verzeichnis haben. Zum Beispiel, Sie sagen, dass was auch immer in Ordner src ist, beginnt es nur mit \App\Package Namespace. Die Klasse \App\Package\User sollte sich in src/User.php befinden, natürlich mit korrektem Namensraum. Das ist, was von Laravel verwendet wird, und die meisten Pakete in diesen Tagen.

+0

Danke, das ist sehr informativ. – Maxcot