Nous savons que l'un des objectifs les plus clairs de l' espace de noms est de résoudre le problème des noms en double, donc en PHP, deux fonctions ou classes ne sont pas autorisées à avoir le même nom, sinon une erreur fatale se produira se produire. . Dans ce cas, le problème peut être résolu à condition d'éviter la duplication de nom. La méthode la plus courante consiste à se mettre d'accord sur un préfixe.
Le but de l'utilisation de l'espace de noms :
Lorsque vous travaillez en équipe Lorsque vous travaillez sur un projet, évitez les conflits avec les classes créées par d'autres membres de l'équipe lorsque des individus ; sont responsables du projet, évitez d'en créer de nouvelles avant et après. Il y a un conflit entre les classes
D'après ma compréhension personnelle, lors de l'utilisation de la classe requise, elle doit d'abord être introduite par require ou include, donc ; la condition préalable pour qu'une erreur de redéfinition de classe se produise est la suivante : deux classes portant le même nom ont été introduites. Actuellement, certains frameworks PHP chargeront automatiquement (c'est-à-dire incluront) toutes les nouvelles classes de modèle, donc afin d'éviter les conflits de noms entre vos nouvelles classes de modèle et les classes de base natives du framework du projet, un espace de noms est utilisé. (Après y avoir réfléchi, les conflits avec les nouvelles classes créées par les membres de l'équipe doivent être évités grâce à la communication. Même après l'incident, le nom de la classe doit être réajusté et maintenu immédiatement pour éviter une complexité de maintenance accrue causée par une confusion dans la compréhension ultérieure de la classe. )
Combiné avec les méthodes d'utilisation pour mieux comprendre son objectif.
Comment utiliser l'espace de noms :
Pour les tests, je vais créer 3 fichiers : 1.php et name.php (ce fichier est utilisé pour effectuer des tests), qui ne seront pas expliqués plus tard. Veuillez noter que le code change vous-même.
1. La définition du nom après l'espace de noms n'est pas sensible à la casse
un espace de noms ; utilisez-en simplement un comme votre propre standard. (J'utiliserai la première méthode pour tester dans le code suivant)
2 Si l'espace de noms n'est pas défini, il est entendu que l'espace de noms de niveau supérieur est utilisé. Lors de la création d'une nouvelle classe, vous pouvez ajouter ou non une barre oblique inverse avant la classe.
//1.php class Person{ function construct(){ echo 'I am one!'; } } //name.php require_once './1.php'; new Person(); //输出 I am one!; new \Person(); //输出 I am one!;
//name.php require_once './1.php'; new /Person(); // 代码报错:Parse error: syntax error, unexpected '/'
/1.php namespace one; class Person{ function construct(){ echo 'I am one!'; } } //name.php require_once './1.php'; new \one\Person(); //输出 I am one!; new \Person(); //代码报错:Fatal error: Class 'Person' not found
//1.php namespace one; class Person{ function construct(){ echo 'I am one!'; } } //name.php namespace test; require './1.php'; new \one\Person(); //输出 I am one!; new Person(); //这里结果会是什么呢,猜猜看
Fatal error: Class 'test\Person' not found
Ici, avec l'espace de noms, la signification d'avoir et de ne pas avoir de barres obliques inverses est différente. Remplacez la dernière ligne de
par
et le résultat est une erreur :new \Person();
Fatal error: Class 'Person' not found
Pour renforcer davantage la vérification, j'ai modifié le fichier name.php comme suit :
Enfin, cet exemple a rafraîchi ma compréhension de require. Selon ma compréhension précédente de require : avant que le programme PHP ne soit exécuté, il lira d'abord le fichier spécifié par require, ce qui en fait une partie de la page Web du programme PHP. Je le comprends donc souvent simplement comme un remplacement, ce qui consiste simplement à remettre le code extrait à sa place d'origine. Ensuite j'ai essayé de mettre le contenu du fichier 1.php dans name.php ://name.php namespace test; require './1.php'; class Person{ function construct(){ echo 'I am test!'; } } new \one\Person(); //输出 I am one!; new Person(); //这里结果会是什么,自己猜猜看
//name.php namespace test; namespace one; class Person{ function construct(){ echo 'I am one!'; } } class Person{ function construct(){ echo 'I am test!'; } }
Il semble que la simple compréhension de require comme remplacement ne fonctionne pas ici.
6. L'espace de noms ne contient pas le nom de la classe. Même s'il existe une partie avec le même nom que le nom de la classe, elle ne représente pas la classe. nouvelle classe, vous devez encore apporter cette partie.
}new testpersonPerson(); //person ne peut pas représenter le nom de la classe dans l'espace de nomsMais c'est purement superflu, n'incluez simplement pas le nom de la classe dans l'espace de noms.//name.php namespace test\person; class Person{ function construct(){ echo 'I am test!'; }
7. Plusieurs espaces de noms peuvent exister dans un fichier php, et il ne peut y avoir de code avant le premier espace de noms.
Cela dit seulement qu'il ne peut y avoir de code avant le premier espace de noms, et qu'il peut y avoir du code avant les espaces de noms suivants. Vous pouvez tester cela vous-même.
//name.php namespace test; echo 'zhai14'; namespace zhai; require './1.php';
espace de noms php
l'espace de noms a pris fin, parlons de l'utilisation de use.
使用use的目的:
在命名空间字符串过长时,使用use可以相应的缩短命名空间。
use的使用方法:
1.new类时,最前面无需用反斜杠。此外,use后没有as时,缩短的命名空间默认为最后一个反斜杠后的内容。
//name.php namespace animal\dog; class Life{ function construct(){ echo 'dog life!'; } } namespace animal\cat; class Life{ function construct(){ echo 'cat life!'; } } new Life(); //按照代码执行顺序,这里默认animal\cat这个命名空间 new \animal\dog\Life(); //A use animal\dog; //a new dog\Life(); //B use animal\dog as d; //b new d\Life();
通过A、B行代码比较,需要注意:
使用use后,new类时,最前面没有反斜杠。
没使用use时,命名空间最前面有反斜杠
通过a、b行代码比较,可以理解:
use后没有as时,缩短的命名空间默认为最后一个反斜杠后的内容。如上的:
use animal\dog;
相当于
use animal\dog as dog;
2.namespace后面不建议加类名,但use后可以。
//name.php namespace animal\dog; class Life{ function construct(){ echo 'dog life!'; } } namespace animal\cat; class Life{ function construct(){ echo 'cat life!'; } } use animal\dog\Life as dog; new dog();
如上所示,use后加上类名后,就相当于把类改了个名称:由Life改为dog了。
上面不用as dog就会报错:
Fatal error: Cannot use animal\dog\Life as Life because the name is already in use
因为cat下也有个一样名称的Life类。
可以理解为,使用use后,这个昵称对应的类只能归当前命名空间占有,其它命名空间下不允许存在该类。
//name.php namespace animal\dog; class Life{ function construct(){ echo 'dog life!'; } } class Dog{ function construct(){ echo 'dog in dog!'; } } namespace animal\cat; // class Dog{ // function construct(){ // echo 'dog in cat!'; // } // } class Life{ function construct(){ echo 'cat life!'; } } use animal\dog; new dog\Dog();
如上,使用了
use animal\dog; cat
通过上面代码,我想使用use的目的效果(缩短命名空间名称)就很明显了。
简单总结一下:
namespace就是划分领域的作用,代表这些东西是属于某个命名空间下的。
相信看了这些案例你已经掌握了方法,更多精彩请关注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!