Eine kurze Einführung in PHP-Namespaces

小云云
Freigeben: 2023-03-20 11:26:01
Original
2856 Leute haben es durchsucht

1: Namespace-Konzept: Namespace ist eine Methode zum Kapseln von Dingen, ähnlich wie Verzeichnisse und Dateien.

Durch Namespaces gelöste Probleme (das Handbuch ist auch sehr klar geschrieben und das Folgende ist nach meinem eigenen Verständnis vereinfacht):

1: Lösen Sie die Probleme von Klassen, Konstanten, Funktionen usw ist ein Namenskonflikt innerhalb von PHP oder einem Dritten.

2: Erstellen Sie Aliase, um das Problem zu langer Namen von Klassen, Konstanten und Funktionen zu lösen und die Lesbarkeit des Codes zu verbessern. Darüber hinaus werden zu lange Namen normalerweise durch die Abschwächung des ersten verursacht Art des Problems.

2: So definieren Sie einen Namespace

1: Der Namespace wird mit dem Schlüsselwort namespace deklariert. Gleichzeitig muss sich der Namespace vor anderem Code befinden, einschließlich jeglichem Nicht-PHP-Code und Leerzeichen (PHP-Deklarationsschlüsselwörter), andernfalls wird ein schwerwiegender Fehler ausgegeben.

Zum Beispiel:

<?php 
namespace Index; 
?>
Nach dem Login kopieren

Hinweis 1: Wenn vor dem Namespace kein Code oder Leerzeichen steht, aber dennoch ein schwerwiegender Fehler auftritt, sollte dies durch den BOM-Header verursacht werden Stücklistenkopf. Das ist es.
Hinweis 2: Obwohl der gesamte legale PHP-Code unter dem Namespace platziert werden kann, sind nur die Klassen (abstrakte Klassen und Merkmale), Schnittstellen, Konstanten und Funktionen betroffen, die vom Namespace betroffen sind.

2: Ähnlich wie die Beziehung zwischen Verzeichnissen und Dateien ermöglichen PHP-Namespaces auch die Angabe hierarchischer Namespace-Namen. Daher können Namespace-Namen hierarchisch definiert werden, getrennt durch .

Zum Beispiel:

<?php 
namespace Index\Col\File; 
define(&#39;MESSAGE&#39;,&#39;hello world&#39;); 
?>
Nach dem Login kopieren

3: In einer Datei können mehrere Namespaces definiert werden. Es gibt zwei Definitionssyntaxen, eine ist eine einfache Kombinationssyntax und die andere ist eine Klammerformsyntax Die Verwendung einer anderen Datei zum Definieren mehrerer Namespaces ist im Allgemeinen ein Szenario, in dem mehrere Dateien in einer Datei zusammengeführt werden. Es ist jedoch am besten, dies nicht zu tun, es sei denn, es ist unbedingt erforderlich, da es die Komplexität des Codes erhöht und die Lesbarkeit im Allgemeinen verringert Für diese Verwendung besteht keine Notwendigkeit.

Einfache Kombinationssyntax:

<?php 
namespace Index; 
const INSTANCE=1; 
 
namespace Col; 
const INSTANCE=2; 
?>
Nach dem Login kopieren

Syntax mit geschweiften Klammern, eine Datei hat mehrere Namespaces. Wenn Sie Nicht-Namespace-Code schreiben müssen, können Sie nur die Syntax mit geschweiften Klammern und Nicht-Namespace-Code verwenden Deklarieren Sie mithilfe des Namespace einen Namespace ohne Namen und verwenden Sie dann geschweifte Klammern:

<?php 
/*命名空间Index*/ 
namespace Index{ 
  const INSTANCE=1; 
} 
 
/*命名空间Col*/ 
namespace Col{ 
  const INSTANCE=2; 
} 
 
/*全局非命名空间代码*/ 
namespace { 
  const INSTANCE=3; 
} 
?>
Nach dem Login kopieren

4: Mehrere verschiedene Dateien können denselben Namespace definieren, d. h. denselben Namen Der Inhalt des Raums kann in mehreren verschiedenen Dateien gespeichert werden, es gibt hier jedoch keine Beispiele.

Drei: Namespace-Identifikationsprinzip

Es gibt drei Situationen, in denen das Namespace-Verwendungsprinzip verwendet wird. Das Handbuch erklärt es tatsächlich im Detail, es kann jedoch aufgrund von Übersetzungsproblemen zu Verwirrung führen Ich werde es vereinfachen und meine eigenen verwenden. Sortieren wir die Beispiele:

1: Es gibt keinen qualifizierten Namen, dh der Name der zu lesenden Klasse, Konstante, Funktion und Schnittstelle wird direkt verwendet In diesem Fall werden die Klasse, die Konstante und der Namespace des Namespace, zu dem der Inhalt gehört, gelesen. Wenn der Namespace jedoch keine relevanten Daten enthält, wird ein schwerwiegender Fehler zurückgegeben, wenn es sich um eine Klasse oder handelt Wenn es sich um eine Funktion oder Konstante handelt, werden globale Funktionen und Konstanten automatisch gelesen. Wenn keine globale Funktion oder Konstante vorhanden ist, wird ein schwerwiegender Fehler gemeldet.

Das folgende Beispiel:

<?php 
/*全局非命名空间代码*/ 
namespace { 
  const INSTANCE=1; 
 
  function test(){ 
    echo 1; 
  } 
 
  class foo{ 
    static function fool(){ 
          echo 1; 
        } 
  } 
 
  var_dump(INSTANCE);   //打印出来的是1 
 
  test();       //输出1 
 
  foo::fool();      //输出1 
 
} 
 
/*命名空间Index*/ 
namespace Index{ 
  const INSTANCE=2; 
 
  function test(){ 
    echo 2; 
  } 
 
  class foo{ 
    static function fool(){ 
          echo 2; 
        } 
  } 
 
  var_dump(INSTANCE);   //打印出来的是2 
 
  test();     //输出2 
 
  foo::fool();    //输出2 
} 
 
/*命名空间Col*/ 
namespace Col{ 
  const INSTANCE=3; 
 
  function test(){ 
    echo 3; 
  } 
 
  class foo{ 
    static function fool(){ 
          echo 3; 
        } 
  } 
 
  var_dump(INSTANCE);   //打印出来的是3 
 
  test();     //输出2 
   
  foo::fool();    //输出2 
} 
?>
Nach dem Login kopieren

Im obigen Beispiel hat jede Namespace-Ausgabe keinen qualifizierten Namen, sodass der entsprechende im aktuellen Namespace festgelegte Datenwert abgerufen wird.

Wenn der aktuelle Namespace nicht festgelegt ist, lesen Funktionen und Konstanten die entsprechenden global festgelegten Datenwerte nur, wenn keine entsprechende globale Einstellung vorhanden ist. Klassen und Schnittstellen melden schwerwiegende Fehler direkt , wie im folgenden Code Show gezeigt.

<?php 
/*全局非命名空间代码*/ 
namespace { 
  const INSTANCE=1;  
  function test(){ 
    echo 1; 
  } 
 
  class foo{ 
    static function fool(){ 
          echo 1; 
        } 
  } 
 
  var_dump(INSTANCE);   //打印出来的是1  
  test();     //输出1  
  foo::fool();    //输出1  
} 
 
/*命名空间Index*/ 
namespace Index{ 
  var_dump(INSTANCE);   //打印出来的是1  
  test();     //输出1  
  foo::fool();    //fatal error 
 
} 
?>
Nach dem Login kopieren

2: Qualifizierter Name, unterteilt in zwei Situationen: Eine ist der Fall, wenn ein qualifizierter Name ein Präfix enthält, und die andere ist der Fall, wenn ein globaler qualifizierter Name enthalten ist. Das Handbuch trennt diese beiden Typen getrennt, aber ich denke, dass diese beiden miteinander kombiniert werden können. Sie haben beide qualifizierte Namen, aber ersterer hat keine globalen Qualifikationen, während letzterer globale Qualifikationen hat.

① Ein qualifizierter Name, der ein Präfix enthält, kann jedoch mehrere oder eine Ebene haben, aber die am weitesten links stehende Ebene kann kein globaler Qualifizierer sein. In diesem Fall wird der Namespace gelesen, in dem sich der Code befindet, und die Präfixqualifikation Die dem Namen entsprechenden Daten, also:

, werden durch Präfixqualifizierung des Namens im Namespace gelesen. Wenn der Code keinen globalen Namespace hat, wird er direkt durch Präfixqualifizierung gelesen der Name, das heißt: Präfix-qualifizierter Name zum Lesen.

Beispielcode:

<?php 
/*命名空间Col\Index*/ 
namespace Col\Index{ 
  const INSTANCE=1; 
} 
 
/*命名空间Index*/ 
namespace Index{ 
  const INSTANCE=2; 
} 
 
/*命名空间Col*/ 
namespace Col{ 
  const INSTANCE=3; 
  var_dump(Index\INSTANCE); //打印出来的是1 读取的是Col\Index\INSTANCE 
} 
 
/*全局非命名空间代码*/ 
namespace { 
  const INSTANCE=4; 
  var_dump(Index\INSTANCE); //打印出来的是2 读取的是Index\INSTANCE 
} 
 
?>
Nach dem Login kopieren

②Globaler qualifizierter Präfixname: Das heißt, ein durch einen globalen Operator ganz links modifizierter präfixqualifizierter Name kann natürlich auch direkt global bedient werden ohne Präfixqualifikation Es ist auch möglich, ein Symbol mit einem Namen hinzuzufügen. Nach dem Hinzufügen des globalen Operators entspricht dieser jedoch dem absoluten Pfad im Verzeichnis und wird erst nach der globalen Qualifizierung gemäß den Einstellungen gelesen.

Die konkreten Beispiele sind wie folgt:

<?php 
/*命名空间Col\Index*/ 
namespace Col\Index{ 
  const INSTANCE=1; 
} 
 
/*命名空间Index*/ 
namespace Index{ 
  const INSTANCE=2; 
} 
 
/*命名空间Col*/ 
namespace Col{ 
  const INSTANCE=3; 
  var_dump(\Index\INSTANCE); //打印出来的是2 读取的是Index\INSTANCE 
} 
 
/*全局非命名空间代码*/ 
namespace { 
  const INSTANCE=4; 
  var_dump(\Index\INSTANCE); //打印出来的是2 读取的是Index\INSTANCE 
} 
 
namespace Lin{ 
  const INSTANCE=5; 
  var_dump(\INSTANCE); //打印出来的是4 读取的是INSTANCE,是全局非命名空间里的INSTANCE,如果没有全局操作符\,读取的会是当前命名空间的Lin\INSTANCE=5 
} 
 
?>
Nach dem Login kopieren

Viertens: Escape des Namensraums in der Zeichenfolge

Manchmal wird der Namensraum in der Zeichenfolge verwendet, wenn keine einfachen Anführungszeichen verwendet werden Vom Compiler interpretiert, gibt es also kein Problem. Wenn es sich jedoch um doppelte Anführungszeichen handelt, kann es zu unerwarteten Situationen kommen. Sie müssen wissen, dass der Inhalt in doppelten Anführungszeichen vom Compiler interpretiert und dann ausgegeben werden muss im Compiler kann leicht zu Unklarheiten führen.

Zum Beispiel wird n in „indexname“ als Zeilenumbruch interpretiert. Darüber hinaus gibt es viele andere Situationen, die zu Unfällen führen.

因此一般我们推荐命名空间如果要放在字符串中使用,最好使用单引号,一是效率,二是安全,如果使用双引号,则必须增加一个\进行转义避免歧义,例如"index\\name"这样就没有问题了。

随手双引号的举个例子:

<?php 
/*全局非命名空间代码*/ 
namespace Index\Name{ 
  class foo{ 
    function __construct(){ 
      echo 2; 
    } 
  } 
} 
 
namespace{ 
  $a= "Index\\Name\\foo"; //用\转义了\所以可以正常运行,但是如果去掉转义的话会报错Class 'Index\Nameoo',因为/f被解释成了换页符 
  $obj=new $a; 
}
Nach dem Login kopieren

这部分碍于篇幅就暂时到这里了,下一篇主要总结命名空间里的namespace和__NAMESPACE__的使用,以及别名的使用等。

相关推荐:

php的命名空间解读

php命名空间用法详解

简单聊聊关于jquery的事件名称与命名空间

Das obige ist der detaillierte Inhalt vonEine kurze Einführung in PHP-Namespaces. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage