Cet article présente principalement un résumé pratique de l'utilisation et de l'utilisation de l'espace de noms de l'espace de commande PHP. Les amis qui en ont besoin peuvent s'y référer
L'un des objectifs les plus clairs de l'espace de noms est de résoudre le problème des noms en double. . Deux noms ne sont pas autorisés en PHP. Si deux fonctions ou classes portent le même nom, une erreur fatale se produira. 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 sur un projet d'équipe, évitez les conflits avec les classes créées par d'autres membres de l'équipe lorsque des individus le sont ; responsable du projet, éviter les conflits entre les classes nouvellement créées avant et après
Selon la compréhension personnelle, lors de l'utilisation de la classe requise, elle doit d'abord être introduite par require ou include, donc la prémisse d'une redéfinition de classe L'erreur qui se produit est la suivante : deux classes portant le même nom. Des classes ont été introduites. Actuellement, certains frameworks PHP chargeront automatiquement (c'est-à-dire incluront) toutes les classes de modèle nouvellement créées. Ainsi, afin d'éviter les conflits de noms entre vos nouvelles classes de modèle et les classes principales 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 utilisé pour effectuer des tests), qui ne seront pas expliqués plus tard. Veuillez faire vous-même attention aux modifications du code.
1. La définition des noms après l'espace de noms n'est pas sensible à la casse
namespace one;
namespace One;
namespace ONE;
Toutes les méthodes d'écriture ci-dessus sont acceptables, choisissez-en simplement une comme votre propre norme. (J'utiliserai la première méthode pour tester dans le code suivant)
2. S'il n'y a pas d'espace de noms 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!;
3. Lorsque vous ajoutez une nouvelle classe, lorsque vous apportez un espace de noms, assurez-vous d'utiliser des caractères de barre oblique inverse au lieu de Slash.
Méthode de mémoire : recherchez les barres obliques en % dans l'ordre dans lequel elles sont interprétées comme des barres obliques. (Parfois, quand je parle de barres obliques inverses, je ne sais même pas dans quelle direction il s'agit. Je m'en souvenais dans le sens ascendant de gauche à droite, mais maintenant je trouve que c'est trop peu fiable)
//name.php require_once './1.php'; new /Person(); // 代码报错:Parse error: syntax error, unexpected '/'
4. La classe est dans l'espace de noms spécifié. Lorsque vous créez une nouvelle classe, assurez-vous d'apporter l'espace de noms spécifié.
n'apporte pas l'espace de noms spécifié. Selon le point 2, PHP trouvera cette classe à partir de l'espace de noms de niveau supérieur. N'oubliez pas : cela ne peut pas être compris car l'espace de noms de niveau supérieur inclut tous les autres espaces de noms. Au lieu de cela, l’espace de noms de niveau supérieur doit être complètement séparé des autres espaces de noms.
//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
Vous pouvez prendre cet exemple populaire pour comprendre : apporter un espace de noms désigné pour représenter la pomme de quelqu'un (dans sa main), l'espace de noms de niveau supérieur représente les pommes dans la boîte à pommes (dans la boîte). Maintenant, si vous voulez trouver la pomme de quelqu'un, vous devez apporter l'espace de noms de quelqu'un, sinon vous chercherez la pomme de quelqu'un dans la boîte, et bien sûr vous ne la trouverez pas.
5. Le code après la déclaration de l'espace de noms appartient à cet espace de noms, même s'il y a include ou require, il ne sera pas affecté (l'accent est mis sur la compréhension de la seconde moitié de la phrase, voir le code pour plus de détails).
//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(); //这里结果会是什么呢,猜猜看
La dernière ligne entraîne une erreur :
Fatal error: Class 'test\Person' not found
Tout d'abord, comparez ici avec le point 2 :
Au point 2, j'ai dit que lorsqu'il n'y a pas d'espace de noms et de nouvelle classe, cela signifie la même chose qu'il y ait une barre oblique inverse ou non.
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 par
new \Person();
Le résultat est une erreur :
Fatal error: Class 'Person' not found
Ensuite, parlons du point actuel.
Nous pouvons constater que l'espace de noms correspondant à la dernière ligne de code est test et n'est pas affecté par l'espace de noms dans le fichier require.
Pour renforcer encore la vérification, j'ai modifié le fichier name.php comme suit :
//name.php namespace test; require './1.php'; class Person{ function __construct(){ echo 'I am test!'; } } new \one\Person(); //输出 I am one!; new Person(); //这里结果会是什么,自己猜猜看
Enfin, cet exemple a rafraîchi ma compréhension de require J'ai compris.
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; namespace one; class Person{ function __construct(){ echo 'I am one!'; } } class Person{ function __construct(){ echo 'I am test!'; } }
Sans la nouvelle classe, le fichier signalera une erreur :
Erreur fatale : impossible de redéclarer la classe onePerson
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.
//name.php namespace test\person; class Person{ function __construct(){ echo 'I am test!'; } }new \test\person\Person(); //命名空间里person无法代表类名
Mais c'est tout simplement superflu, n'incluez simplement pas le nom de la classe dans l'espace de noms.
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.
只说第一个命名空间前不能有任何代码,之后的命名空间之前可以有代码。这个自行测试即可。
//name.php namespace test; echo 'zhai14'; namespace zhai; require './1.php';
php命名空间namespace告一段落了,接下来说说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就是划分领域的作用,代表这些东西是属于某个命名空间下的。
use就是起小名的作用,不论写起来还是说起来都可以省不少事儿。
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!