Heim  >  Artikel  >  Backend-Entwicklung  >  Was ist ein Namespace in PHP? Warum Namespaces verwenden?

Was ist ein Namespace in PHP? Warum Namespaces verwenden?

青灯夜游
青灯夜游nach vorne
2020-07-17 15:36:053760Durchsuche

Was ist ein Namespace in PHP? Warum Namespaces verwenden?

Erklärung: Dieser Artikel basiert auf modernem PHP und verwendet den Laravel-Quellcode als Beispiel, um es jedem einfacher zu machen, den zugrunde liegenden Quellcode zu studieren.

1. Was ist ein Namespace?

Wenn Sie nur eine der modernen PHP-Funktionen kennen müssen, sollte es die Benennung sein Raum. Namespace wurde in PHP5.3.0 eingeführt. Seine Funktion besteht darin, PHP-Code gemäß einer virtuellen hierarchischen Struktur zu organisieren. Diese hierarchische Struktur ähnelt der Verzeichnisstruktur des Dateisystems im Betriebssystem.

[Verwandte Empfehlungen: PHP-Tutorial]

Namespace ist die Grundlage der modernen PHP-Komponentenökologie. Moderne PHP-Komponenten-Framework-Codes werden in ihren jeweiligen Globals platziert. in einem eindeutigen Anbieter-Namespace, um Konflikte mit allgemeinen Klassennamen zu vermeiden, die von anderen Anbietern verwendet werden.

Werfen wir einen Blick darauf, wie echte PHP-Komponenten Namespaces verwenden. Die Http-Komponente im Laravel-Framework wird zum Verwalten von HTTP-Anfragen und -Antworten verwendet. Diese Komponente verwendet gemeinsame Klassennamen, wie z. B. Request und Response. Da auch andere PHP-Codes denselben Klassennamen verwenden. Wie verwende ich diese Komponente?

Tatsächlich können wir es mit Zuversicht verwenden, da der Code dieser Komponente im einzigen Hersteller-Namespace platziert ist Illuminate.

Öffnen Sie das Repository dieser Komponente in GitHub (https://github.com/laravel/framework/blob/master/src/Illuminate/Http/Response.php) und suchen Sie die Datei Response.php:

Die dritte Codezeile lautet wie folgt:

namespace Illuminate\Http;

Diese Zeile ist die PHP-Namespace-Deklarationsanweisung. Der Code, der den Namespace deklariert, sollte immer nach dem platziert werden <?php Tag Erste Zeile. Durch die Deklarationsanweisung dieses Namensraums können wir sehen, dass sich Response im Hersteller-Namensraum Illuminate (dem Namensraum der obersten Ebene) befindet. Wir sehen auch, dass sich die Klasse Response im Unter-Namensraum Http befindet . Sie können einen Blick auf andere Dateien auf derselben Ebene wie die Datei Response.php werfen. Sie werden feststellen, dass sie alle dieselbe Namespace-Deklarationsanweisung verwenden.

Die Rolle des Namespace besteht darin, verwandte PHP-Klassen zu kapseln und zu organisieren, genau wie verwandte Dateien im selben Verzeichnis im Dateisystem abzulegen. Der PHP-Namespace unterscheidet sich vom physischen Dateisystem des Betriebssystems. Er ist ein virtuelles Konzept und muss nicht unbedingt mit der Verzeichnisstruktur im Dateisystem übereinstimmen. Die meisten PHP-Komponenten sind jedoch mit den weit verbreiteten kompatibel PSR-4-Autoloading-Standard. Der Namespace wird in einem Unterverzeichnis des entsprechenden Dateisystems abgelegt.

2. Warum Namespaces verwenden

Wie bereits erwähnt, verwendet unser Code möglicherweise dieselbe Klasse wie der Code anderer Entwickler. Name, Schnittstellenname, Wenn der Namespace nicht verwendet wird, kommt es zu Konflikten zwischen den Namen, was zu PHP-Ausführungsfehlern führen kann. Durch die Verwendung von Namespaces zum Platzieren von Code in einem eindeutigen Hersteller-Namespace kann unser Code denselben Klassennamen, Schnittstellennamen, dieselbe Funktion oder denselben Konstantennamen wie andere Entwickler verwenden.

Wenn Sie ein kleines persönliches Projekt mit nur wenigen Abhängigkeiten entwickeln, stellen Klassennamenkonflikte natürlich möglicherweise kein Problem dar, aber wenn Sie in einem Team arbeiten und große Projekte entwickeln, die viele Abhängigkeiten von Drittanbietern nutzen , Sie müssen das Problem des Namenskonflikts ernst nehmen, da Sie die durch die Projektabhängigkeiten in den globalen Namespace eingeführten Klassen, Schnittstellen, Funktionen und Konstanten nicht steuern können, weshalb Namespaces verwendet werden.

3. Einen Namespace deklarieren

Jede PHP-Klasse, Schnittstelle, Funktion und Konstante befindet sich in einem Namespace. , deklariert in der ersten Zeile nach dem <?php-Tag, beginnt die Deklarationsanweisung mit namespace, gefolgt von einem Leerzeichen, dann dem Namen des Namespace und endet schließlich mit ;. Der Namespace

wird häufig verwendet, um den Herstellernamen der obersten Ebene festzulegen. Beispielsweise setzen wir den Herstellernamen auf LaravelAcademy

<?php
   namespace LaravelAcademy;
Alle PHP-Klassen, Schnittstellen, Funktionen und Konstanten befinden sich alle im

-Namespace und haben eine gewisse Beziehung zur Laravel Academy. Was wäre, wenn wir den von der Akademie verwendeten Code organisieren möchten? Die Antwort ist die Verwendung von Subnamespaces. LaravelAcademy

Die Deklarationsmethode des Sub-Namespace ist genau die gleiche wie im vorherigen Beispiel. Der einzige Unterschied besteht darin, dass wir das Symbol

verwenden, um den Namespace und den Sub-Namespace zu trennen, zum Beispiel:

<?php
   namespace LaravelAcademy\ModernPHP;
Alle Klassen, Schnittstellen, Funktionen und Konstanten nach diesem Namensraum befinden sich in

. Klassen im selben Namespace müssen nicht in derselben PHP-Datei deklariert werden. Sie können oben in der PHP-Datei einen Namespace oder Sub-Namespace angeben. Zu diesem Zeitpunkt ist der Code dieser Datei Teil des Namespace oder Sub -Namespace. Daher können wir mehrere Klassen, die zum selben Namespace gehören, in verschiedene Dateien schreiben. LaravelAcademyModernPHP

注:厂商命名空间是最顶层的命名空间,也是最重要的命名空间,用于识别品牌或组织,必须具有全局唯一性。子命名空间相对而言没那么重要,但是可以用于组织项目的代码。

4、导入和别名

在命名空间出现之前,PHP开发者使用Zend风格的类名解决命名冲突问题,这是一种类的命名方案,因Zend框架而流行,这种命名方案在PHP类名中使用下划线的方式表示文件系统的目录分隔符。这种约定有两个作用:其一,确保类名是唯一的;其二,原生的自动加载器会把类名中的下划线替换成文件系统的目录分隔符,从而确定文件的路径。例如,Zend_Cloud_DocumentService_Adapter_WindowsAzure_Query类对应的文件是Zend/Cloud/DocumentService/Adapter/WindowsAzure/Query.php。可以看出,这种命名有个缺点:类名特别长。

现代的PHP命名空间也有这个问题,例如上述Response类完整的全名是Illuminate\Http\Response,幸好,我们可以通过导入以及创建别名的方式来改变这一状况。

导入的意思是指,在每个PHP文件中告诉PHP想使用哪个命名空间、类、接口、函数和常量,导入后就不用使用全名了:

  <?php
    use Illuminate\Http\Response;

    $response = new Response(‘Oops’, 400);
    $response->send();

我们通过use关键字告诉PHP,我们想使用Illuminate\Http\Response类,我们只需要输入一次完全限定的类名,随后实例化Response的时候,无需使用完整的类名。

如果觉得这样的类名还是长,可以创建别名。创建别名指的是告诉PHP我要使用简单的名称引用导入的类、接口、函数或常量:

   <?php

    use Illuminate\Http\Response as Res;

    $res = new Res(‘Oops’, 400);
    $res->send();

从PHP 5.6开始还可以导入函数和常量,不过要调整use关键字的句法,如果要导入函数,需要使用use func

  <?php
    use func Namespace\functionName

    functionName();

如果想导入常量,可以使用use constant

  <?php
    use constant Namespace\CONST_NAME;

    echo CONST_NAME;

当然也支持别名,创建方式和类一样。

5、实用技巧

多重导入

如果想要在PHP文件中导入多个类、接口、函数或常量,需要在PHP文件的顶部使用多个use语句,PHP支持用简短的语法把多个use语句写成一行:

  <?php
    use Illuminate\Http\Request,
    Illuminate\Http\Response;

但是为了可读性,建议不要这么写,还是一行写一个use语句比较好:

  <?php
    use Illuminate\Http\Request;
    use Illuminate\Http\Response;

一个文件使用多个命名空间

PHP允许在一个文件中定义多个命名空间:

<?php
    namespace Foo {
      //声明类、接口、函数、常量
    }

    namespace Bar {
      //声明类、接口、函数、常量
    }

但这么做不好,违背了“一个文件一个类”的良好实践,因此不建议这么做。

全局命名空间

如果引用的类、接口、函数和常量没有指定命名空间,PHP假定引用的类、接口、函数和常量在当前的命名空间中。如果要使用其他命名空间的类、接口、函数或常量,需要使用完全限定的PHP类名(命名空间+类名)。

有些代码在全局命名空间中,没有命名空间,比如原生的Exception类就是这样。在命名空间中引用全局的代码时,需要在类、接口、函数或常量前加\符号:

<?php
    namespace My\App;

    class Foo {
      public function doSomething() {
         throw new \Exception();
      }
    }

自动加载

命名空间还为PHP-FIG制定的PSR-4自动加载标准奠定了坚实的基础,大多数现代的PHP组件都使用了这种自动加载模式,使用依赖管理器Composer可以自动加载项目的依赖,后续我们还会详细介绍Composer和PHP-FIG,现在你只需要知道没有命名空间,就没有现代的PHP生态系统和基于组件的新型架构,由此可见命名空间的重要性。

相关学习推荐:PHP编程从入门到精通

Das obige ist der detaillierte Inhalt vonWas ist ein Namespace in PHP? Warum Namespaces verwenden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:cnblogs.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen