Heim  >  Artikel  >  Backend-Entwicklung  >  Detaillierte Erläuterung der Verwendung des PHP-Namespace

Detaillierte Erläuterung der Verwendung des PHP-Namespace

php中世界最好的语言
php中世界最好的语言Original
2018-05-18 14:36:272613Durchsuche

Dieses Mal werde ich Ihnen eine detaillierte Erklärung der Verwendung des PHP-Namespace und der Vorsichtsmaßnahmen bei der Verwendung des PHP-Namespace geben. Nehmen wir das Folgende als Beispiel ein Blick.

1: Namespace-Konzept: Namespace ist eine Methode zum Kapseln von Dingen, ähnlich wie bei Verzeichnissen 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; 
?>

Hinweis 1: Wenn vor dem Namespace kein Code oder Leerzeichen vorhanden ist, aber dennoch ein schwerwiegender Fehler auftritt, sollte dies durch den BOM-Header verursacht werden. Entfernen Sie ihn Die Stückliste. Gehen Sie einfach weiter.
Hinweis 2: Obwohl der gesamte legale PHP-Code unter dem Namespace platziert werden kann, sind die einzigen Klassen (abstrakte Klassenund Merkmale) und Schnittstellen, Konstanten und Funktionen, die vom Namespace betroffen sind.

2: Ähnlich wie die Beziehung zwischen Verzeichnissen und Dateien ermöglichen Ihnen 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;); 
?>

3: In einer Datei können mehrere Namespaces definiert werden. Es gibt zwei Definitionssyntaxen, eine ist eine einfache Kombinationssyntax und die andere ist eine geschweifte Klammersyntax Die Verwendung einer anderen Datei, die mehrere Namespaces definiert, ist normalerweise 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 absolut notwendig, 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; 
?>
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 verwenden und sie wird nicht benannt Der Raum Code verwendet Namespace, um einen Namespace ohne Namen zu deklarieren, und verwendet dann geschweifte Klammern:

<?php 
/*命名空间Index*/ 
namespace Index{ 
  const INSTANCE=1; 
} 
 
/*命名空间Col*/ 
namespace Col{ 
  const INSTANCE=2; 
} 
 
/*全局非命名空间代码*/ 
namespace { 
  const INSTANCE=3; 
} 
?>
4: Mehrere verschiedene Dateien können denselben Namespace definieren, was bedeutet, dass der Inhalt desselben Namespace in mehreren verschiedenen Dateien gespeichert werden kann bzw. ich werde hier kein Beispiel nennen.

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 
} 
?>
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 
 
} 
?>
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 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 sind:

所处命名空间\前缀限定\名称来读取,如果该代码是全局没有命名空间的,则直接用前缀限定名称来读取,也就是:前缀限定\名称来读取。

实例代码:

<?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 
} 
 
?>

②全局限定前缀名称:也就是在最左侧有全局操作符\进行修饰的前缀限定名称,当然也可以没有前缀限定直接全局操作符\加上名称也是可以的。但加上全局操作符后就跟目录里的绝对路径一样,只会按照全局限定后的所设置的进行读取。

具体实例如下:

<?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 
} 
 
?>

四:命名空间在字符串中的转义

有时候命名空间会放在字符串中使用,如果是单引号不会通过编译器解释,所以没有任何问题,但是如果是双引号,那么就会有些意外情况了,要知道双引号里的内容是需要经过编译器进行解释然后再进行输出的,而\在编译器里的解释容易造成歧义

例如"index\name"这里就有\n会被解释成换行,除此之外还有很多这种造成意外的情况。

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

随手双引号的举个例子:

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

相信看了本文案例你已经掌握了方法,更多精彩请关注php中文网其它相关文章!

推荐阅读:

Laravel实现密码重置步骤详解

php爬取天猫和淘宝商品数据步骤详解(附代码)

Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung der Verwendung des PHP-Namespace. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
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