Maison  >  Article  >  développement back-end  >  À propos des espaces de noms PHP

À propos des espaces de noms PHP

不言
不言original
2018-05-14 15:52:263837parcourir

Cet article présente l'espace de noms PHP, qui a une certaine valeur de référence. Maintenant, je le partage avec vous. Les amis dans le besoin peuvent s'y référer

Qu'est-ce que l'espace de noms PHP

Manuel PHP : D'une manière générale, les espaces de noms sont un moyen d'encapsuler des choses. Ce concept abstrait se retrouve à de nombreux endroits. Par exemple, les répertoires sont utilisés dans les systèmes d'exploitation pour regrouper les fichiers associés et agissent comme des espaces de noms pour les fichiers du répertoire.

Le rôle de l'espace de noms

1. Conflits de noms entre le code écrit par l'utilisateur et les classes/fonctions/constantes internes de PHP ou les classes/fonctions/constantes tierces.
2. Créez un nom alias (ou court) pour un nom d'identifiant très long (généralement défini pour pallier le premier type de problème) afin d'améliorer la lisibilité du code source.

Exemple

J'ai écrit cet article sur l'espace de noms parce qu'un ami vient de l'apprendre et m'a demandé ce qu'est un espace de noms. Je me demandais comment le décrire simplement et le rendre facile à comprendre. Ci-dessous, j'utiliserai quelques exemples simples pour illustrer ma propre compréhension des espaces de noms.

1. Exemple 1
Nous créons d'abord deux fichiers de classe
a.php

class Test{
    public function test()
    {
        echo "this is A class.";
    }
}

b .php

class Test{
    public function test()
    {
        echo "this is B class.";
    }
}

Créez un autre fichier index.php pour présenter les deux classes ci-dessus et appeler les méthodes qu'elles contiennent.
index.php

require_once("a.php");require_once("b.php");

Maintenant, exécutez le fichier index.php, vous trouverez une erreur fatale : Erreur fatale : Impossible de redéclarer la classe Test dans. . . Évidemment, la classe Test ne peut pas être redéclarée car vous l'avez introduite deux fois et les noms de classe dans les deux fichiers sont les mêmes, ce qui est en conflit. À l’heure actuelle, un espace de noms est nécessaire pour résoudre ce problème, et c’est simple.
2. Exemple 2
Nous modifions maintenant légèrement les deux fichiers de classe.
a.php

namespace a\test;class Test{
    public function test()
    {
        echo "this is A class.";
    }
}

b.php

namespace b\test;class Test{
    public function test()
    {
        echo "this is B class.";
    }
}

Le mot-clé namespace est utilisé pour déclarer le nom spatial. Exécutez maintenant index.php et constatez qu'il n'y a aucune erreur. Modifiez index.php pour tester l'appel de méthode
index.php

require_once("a.php");require_once("b.php");$a = new a\test\Test();$a->test();//页面输出:this is A class.

3. . Exemple 3
Il existe maintenant une autre situation. Par exemple, je dois instancier la classe Test dans a.php plusieurs fois. Que dois-je faire s'il est difficile d'écrire les informations complètes sur l'espace de noms à chaque fois ? faire? Par exemple :
index.php

require_once("a.php");require_once("b.php");$a = new a\test\Test();$a_a = new a\test\Test();$a_b = new a\test\Test();$a->test();$a_a->test();//页面输出:this is A class.this is A class.

Bien qu'il n'y ait pas d'erreur, vous trouverez cela plus gênant. Vous devez écrire le nom complet de l'espace de noms à chaque fois. une erreur est signalée et elle peut être ctrl+c, ctrl+v, mais pas très belle (^_^).
Vous pouvez faire ceci :
index.php

require_once("a.php");require_once("b.php");use a\test\Test;$a = new Test();$a_a = new Test();$a_b = new Test();$a->test();$a_a->test();//页面输出:this is A class.this is A class.

Le mot-clé use est utilisé pour introduire une classe et utiliser un espace de noms pour indiquer l'utilisation de une certaine catégorie. Vous pourrez directement instancier l'opération plus tard
4. Exemple 5
Puis un autre problème survient, le suivant :
index.php

require_once("a.php");require_once("b.php");use a\test\Test;use b\test\Test;$a = new Test();$b = new Test();$a->test();$b->test();

Évidemment, une autre erreur fatale : Erreur fatale : Impossible d'utiliser btestTest comme Test car le nom est déjà utilisé dans . . . Parce que bien que l'espace de noms soit utilisé, les deux classes ont le même nom, toutes deux sont Test. Le programme ne sait pas que la deuxième classe Test est la classe Test dans b.php. À ce stade, vous utilisez le mot-clé as .
Par exemple :
index.php

require_once("a.php");require_once("b.php");use a\test\Test;use b\test\Test as BTest;$a = new Test();$b = new BTest();$a->test();$b->test();//页面输出:this is A class.this is B class.完美解决

as Le mot-clé définit un alias pour le nom de la classe, ce qui peut efficacement empêcher les conflits avec le même nom de classe
5. Exemple 6
Ce qui suit est une autre situation. Je vais d'abord donner quelques extraits de code, qui sont dans le framework Yii2. Ils n'ont rien à voir avec le framework. Ils sont juste à titre de démonstration. Vous pouvez le voir dans de nombreux endroits.

if (\Yii::$app->request->isPost) {
            $post = \Yii::$app->request->post();           ...
        }

Évidemment, une classe Yii est utilisée ici, mais pourquoi y a-t-il une autre barre oblique inverse "" devant elle ? Suivons d'abord la classe Yii. Certains étudiants demanderont comment la suivre si vous l'utilisez. Éditeur PHPstorm, maintenez simplement Ctrl et cliquez sur le nom de la classe pour accéder à ce fichier de classe Pour savoir comment utiliser l'éditeur PHPstorm, veuillez vérifier : Version crackée de PhpStorm et didacticiel d'utilisation
. Voici l'extrait de code du fichier de la classe Yii :

/**
 * Yii bootstrap file.
 *
 * @link http://www.yiiframework.com/
 * @copyright Copyright (c) 2008 Yii Software LLC
 * @license http://www.yiiframework.com/license/
 */require(__DIR__ . '/BaseYii.php');class Yii extends \yii\BaseYii{
}

Vous constaterez que la classe Yii n'a pas d'espace de noms. Nous appelons cette classe une classe globale. Si vous souhaitez l'utiliser, vous devez le faire. ajoutez une barre oblique inverse devant la classe. ””
Par exemple, on crée un fichier de classe global au même niveau que a.php : c.php :

class Test{
    public function test()
    {
        echo "this is C class.";
    }
}

Faites cela dans l'index. Fichier .php pour appeler test dans la méthode c.php

require_once("a.php");
require_once("b.php");
require_once("c.php");
use a\test\Test;use b\test\Test as BTest;
$a = new Test();$b = new BTest();
$c = new \Test();
$a->test();$b->test();
$c->test();
//页面输出:
this is C class.this is A class.this is B class.this is C class.

Remarque : utilisation de mots-clés tels que espace de noms, utilisation, as et utilisation de classes globales.

Qu'est-ce qu'un espace de noms PHP ?

Manuel PHP : D'une manière générale, un espace de noms est une façon d'encapsuler des choses. Cette abstraction peut être trouvée à de nombreux endroits. Par exemple, les répertoires sont utilisés dans les systèmes d'exploitation pour regrouper les fichiers associés et agissent comme des espaces de noms pour les fichiers du répertoire.

Le rôle de l'espace de noms

1. Conflits de noms entre le code écrit par l'utilisateur et les classes/fonctions/constantes internes de PHP ou les classes/fonctions/constantes tierces.
2. Créez un nom alias (ou court) pour un nom d'identifiant très long (généralement défini pour pallier le premier type de problème) afin d'améliorer la lisibilité du code source.

示例

写这个命名空间的文章是因为一个朋友刚学这个来问我命名空间到底是个什么东西。我在想怎么简单的描述出来并且很容易理解。下面我就以几个简单的小例子来说明一下我自己对命名空间的理解。

1. 例一
首先我们先建立两个类文件
a.php

class Test{
    public function test()
    {
        echo "this is A class.";
    }
}

b.php

class Test{
    public function test()
    {
        echo "this is B class.";
    }
}

再建立一个index.php文件,来引入以上两个类并调用其中的方法。
index.php

require_once("a.php");require_once("b.php");

现在运行index.php文件,你会发现有一个致命错误: Fatal error: Cannot redeclare class Test in。。。很显然,无法重新声明Test类,因为你引入了两次,而且两个文件中的类名称相同,冲突了。这个时候就需要命名空间来解决这个问题,并且很容易。
2. 例二
我们现在把两个类文件稍作修改。
a.php

namespace a\test;class Test{
    public function test()
    {
        echo "this is A class.";
    }
}

b.php

namespace b\test;class Test{
    public function test()
    {
        echo "this is B class.";
    }
}

namespace关键字是用来声明命名空间的。现在运行index.php发现没有错误,修改index.php进行方法调用测试
index.php

require_once("a.php");require_once("b.php");$a = new a\test\Test();$a->test();//页面输出:this is A class.

3. 例三
现在有另外一种情况,比如我需要实例化a.php中的Test类多次,那么每次我们都需要命名空间信息完整写的话比较麻烦怎么办呢?比如:
index.php

require_once("a.php");
require_once("b.php");
$a = new a\test\Test();
$a_a = new a\test\Test();
$a_b = new a\test\Test();
$a->test();
$a_a->test();
//页面输出:
this is A class.this is A class.

虽然也没有错误,但是你会发现比较麻烦,每次都需要全写命名空间名称,虽然不报错并且可以ctrl+c,ctrl+v,但是不太美观(^_^)。
你可以这样做:
index.php

require_once("a.php");
require_once("b.php");
use a\test\Test;
$a = new Test();
$a_a = new Test();
$a_b = new Test();
$a->test();
$a_a->test();
//页面输出:
this is A class.this is A class.

use关键字是用来引入类,用命名空间的方式表示使用了某个类。后面就可以直接实例化操作
4. 例五
接下来另一个问题又来了,如下:
index.php

require_once("a.php");require_once("b.php");use a\test\Test;use b\test\Test;$a = new Test();$b = new Test();$a->test();$b->test();

很明显,又一个致命错误:Fatal error: Cannot use b\test\Test as Test because the name is already in use in 。。。因为虽然使用了命名空间,但是两个类名称相同,都是Test,程序不知道第二个Test类是b.php中的Test类,这时候你就用到了as关键字
如:
index.php

require_once("a.php");
require_once("b.php");
use a\test\Test;
use b\test\Test as BTest;
$a = new Test();
$b = new BTest();
$a->test();$b->test();
//页面输出:
this is A class.this is B class.完美解决

as关键字是对类名称定义别名,可以有效防止类名称相同冲突
5. 例六
下面是另一种情况,我先给出几个代码片段,是Yii2框架中的,和框架无关,只是为了演示使用,很多地方都能见到此例。

if (\Yii::$app->request->isPost) {
            $post = \Yii::$app->request->post();           ...
        }

很显然这里使用了一个Yii类,但是为什么前面又一个反斜杠”\”,我们先追踪一下Yii类,有的同学会问怎么追踪呢,如果你使用的是PHPstorm编辑器,直接按住Ctrl,鼠标点击类名就会跳到此类类文件中,关于怎么使用PHPstorm编辑器,请查看:PhpStorm破解版及使用教程
下面是Yii类文件代码段:

/**
 * Yii bootstrap file.
 *
 * @link http://www.yiiframework.com/
 * @copyright Copyright (c) 2008 Yii Software LLC
 * @license http://www.yiiframework.com/license/
 */require(__DIR__ . '/BaseYii.php');class Yii extends \yii\BaseYii{
}

你会发现该Yii类并没有命名空间,我们将这种类叫做全局类,如果要使用需要类前面加入反斜杠”\”
比如我们在a.php同级再建立一个全局类文件:c.php:

class Test{
    public function test()
    {
        echo "this is C class.";
    }
}

在index.php文件中这样做即可调用c.php中的test方法

require_once("a.php");
require_once("b.php");
require_once("c.php");
use a\test\Test;
use b\test\Test as BTest;
$a = new Test();
$b = new BTest();
$c = new \Test();
$a->test();
$b->test();
$c->test();
//页面输出:
this is C class.this is A class.this is B class.this is C class.

注意:namespace,use,as等关键字用法以及全局类的使用。

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:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Article précédent:Une syntaxe de base de phpArticle suivant:Une syntaxe de base de php