Maison  >  Article  >  développement back-end  >  Qu’est-ce qu’un espace de noms en PHP ? Pourquoi utiliser des espaces de noms ?

Qu’est-ce qu’un espace de noms en PHP ? Pourquoi utiliser des espaces de noms ?

青灯夜游
青灯夜游avant
2020-07-17 15:36:053760parcourir

Qu’est-ce qu’un espace de noms en PHP ? Pourquoi utiliser des espaces de noms ?

Déclaration : Cet article est basé sur Modern PHP et utilise le code source de Laravel comme exemple pour permettre à chacun d'étudier plus facilement le code source sous-jacent.

1. Qu'est-ce qu'un espace de noms

Si vous n'avez besoin de connaître qu'une des fonctionnalités PHP modernes, elle devrait être la dénomination. espace. L'espace de noms a été introduit dans PHP5.3.0. Sa fonction est d'organiser le code PHP selon une structure hiérarchique virtuelle. Cette structure hiérarchique est similaire à la structure de répertoires du système de fichiers du système d'exploitation.

[Recommandations associées : Tutoriel PHP]

L'espace de noms est le fondement de l'écologie des composants PHP modernes. Les codes du framework de composants PHP modernes sont placés dans leurs globaux respectifs. dans un espace de noms de fournisseur unique pour éviter les conflits avec les noms de classe courants utilisés par d'autres fournisseurs.

Voyons comment les vrais composants PHP utilisent les espaces de noms. Le composant Http du framework Laravel est utilisé pour gérer les requêtes et les réponses HTTP. Ce composant utilise des noms de classe courants, tels que Request et Response. De nombreux autres composants PHP utilisent également de tels noms de classe, car d'autres codes PHP utilisent également le même nom de classe. comment utiliser ce composant ?

En fait, nous pouvons l'utiliser en toute confiance car le code de ce composant est placé dans le seul espace de noms du fabricant Illuminate.

Ouvrez le référentiel de ce composant dans GitHub (https://github.com/laravel/framework/blob/master/src/Illuminate/Http/Response.php) et recherchez le fichier Response.php :

La troisième ligne de code est la suivante :

namespace Illuminate\Http;

Cette ligne est l'instruction de déclaration de l'espace de noms PHP. Le code déclarant l'espace de noms doit toujours être placé après le. <?php balise Première ligne. Grâce à l'instruction de déclaration de cet espace de noms, nous pouvons voir que Response est situé dans l'espace de noms du fabricant Illuminate (l'espace de noms de niveau supérieur). Nous voyons également que la classe Response est dans le sous-espace de noms Http. . Vous pouvez jeter un œil ci-dessous. D'autres fichiers au même niveau que le fichier Response.php constateront qu'ils utilisent tous la même instruction de déclaration d'espace de noms.

Le rôle de l'espace de noms est d'encapsuler et d'organiser les classes PHP associées, tout comme placer les fichiers associés dans le même répertoire du système de fichiers. L'espace de noms PHP est différent du système de fichiers physique du système d'exploitation. Il s'agit d'un concept virtuel et ne doit pas nécessairement être exactement le même que la structure des répertoires du système de fichiers. Cependant, la plupart des composants PHP sont compatibles avec ceux largement utilisés. Norme de chargement automatique PSR-4. L'espace de noms sera placé dans un sous-répertoire du système de fichiers correspondant.

2. Pourquoi utiliser des espaces de noms

Comme mentionné précédemment, notre code peut utiliser la même classe que le code d'autres développeurs. Nom, nom de l'interface, nom de fonction ou de constante. Si l’espace de noms n’est pas utilisé, le nom entrera en conflit, provoquant des erreurs d’exécution PHP. En utilisant des espaces de noms pour placer le code dans un espace de noms de fabricant unique, notre code peut utiliser le même nom de classe, nom d'interface, fonction ou nom de constante que les autres développeurs.

Bien sûr, si vous développez un petit projet personnel avec seulement quelques dépendances, les conflits de noms de classe peuvent ne pas être un problème, mais si vous travaillez en équipe et développez de grands projets utilisant de nombreuses dépendances tierces , vous devez le prendre au sérieux. Problème de conflit de noms, car vous ne pouvez pas contrôler les classes, interfaces, fonctions et constantes introduites dans l'espace de noms global par les dépendances du projet, c'est pourquoi les espaces de noms sont utilisés.

3. Déclarer un espace de noms

Chaque classe, interface, fonction et constante PHP se trouve dans un espace de noms. La déclaration d'un espace de noms est très simple. , déclarée sur la première ligne après la balise <?php, l'instruction de déclaration commence par namespace, suivie d'un espace, puis du nom de l'espace de noms, et se termine enfin par ;. L'espace de noms

est souvent utilisé pour définir le nom du fabricant de niveau supérieur. Par exemple, nous définissons le nom du fabricant sur LaravelAcademy :

<?php
   namespace LaravelAcademy;

Toutes les classes, interfaces, fonctions et constantes PHP. sont tous dans l'espace de noms LaravelAcademy et entretiennent des relations avec Laravel Academy. Et si on voulait organiser le code utilisé par l’académie ? La réponse est d'utiliser des sous-espaces de noms.

La méthode de déclaration du sous-espace de noms est exactement la même que dans l'exemple précédent. La seule différence est que nous utilisons le symbole pour séparer l'espace de noms et le sous-espace de noms, par exemple :

<?php
   namespace LaravelAcademy\ModernPHP;

Toutes les classes, interfaces, fonctions et constantes après cet espace de noms se trouvent dans LaravelAcademyModernPHP. Les classes du même espace de noms n'ont pas besoin d'être déclarées dans le même fichier PHP. Vous pouvez spécifier un espace de noms ou un sous-espace de noms en haut du fichier PHP. À ce stade, le code de ce fichier fait partie de l'espace de noms ou du sous-espace de noms. -espace de noms. Par conséquent, nous pouvons écrire plusieurs classes appartenant au même espace de noms dans différents fichiers.

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

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编程从入门到精通

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer