Utilisation complète de l'espace de commande PHP

php中世界最好的语言
Libérer: 2023-03-18 07:12:01
original
2228 Les gens l'ont consulté

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.

3. Lors de l'ajout d'un espace de noms à une nouvelle classe, des barres obliques inverses doivent être utilisées à la place des barres obliques.

Méthode de mémorisation : Rechercher les barres obliques en % afin de les comprendre comme des barres obliques. (Parfois, quand je parle de barres obliques inverses, je ne sais même pas dans quelle direction il s'agit. Avant, je m'en souvenais dans le sens ascendant de gauche à droite, mais maintenant je trouve que c'est trop peu fiable)
//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!;
Copier après la connexion

4. Catégorie Sous l'espace de noms spécifié, lors d'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.
//name.php
require_once './1.php';
new /Person(); // 代码报错:Parse error: syntax error, unexpected '/'
Copier après la connexion

Vous pouvez prendre cet exemple populaire pour comprendre : apporter l'espace de noms spécifié représente les pommes de quelqu'un (dans sa main), et 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
require_once './1.php';
new \one\Person(); //输出 I am one!;
new \Person(); //代码报错:Fatal error: Class 'Person' not found
Copier après la connexion

La dernière ligne entraîne une erreur :

//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(); //这里结果会是什么呢,猜猜看
Copier après la connexion
Tout d'abord, comparez cela avec le point 2 :

Point 2, j'ai dit, quand il y a n'y a pas d'espace de noms, dans la nouvelle classe, la signification est la même, qu'il y ait ou non une barre oblique inverse.
Fatal error: Class 'test\Person' not found
Copier après la connexion

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();
Copier après la connexion
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.
Fatal error: Class 'Person' not found
Copier après la connexion

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(); //这里结果会是什么,自己猜猜看
Copier après la connexion

Sans la nouvelle classe, le fichier signalera une erreur :

Erreur fatale : Impossible de redéclarer class onePerson
//name.php
namespace test;
namespace one;
class Person{
 function construct(){
  echo 'I am one!';
 }
}
class Person{
 function construct(){
  echo 'I am test!';
 }
}
Copier après la connexion

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 noms

Mais 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!';
 }
Copier après la connexion

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';
Copier après la connexion

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();
Copier après la connexion


通过A、B行代码比较,需要注意:

使用use后,new类时,最前面没有反斜杠。

没使用use时,命名空间最前面有反斜杠

通过a、b行代码比较,可以理解:

use后没有as时,缩短的命名空间默认为最后一个反斜杠后的内容。如上的:

use animal\dog;

相当于

use animal\dog as dog;
Copier après la connexion

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();
Copier après la connexion


如上所示,use后加上类名后,就相当于把类改了个名称:由Life改为dog了。

上面不用as dog就会报错:

Fatal error:  Cannot use animal\dog\Life as Life because the name is already in use
Copier après la connexion


因为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();
Copier après la connexion


如上,使用了

use animal\dog;
 cat
Copier après la connexion

通过上面代码,我想使用use的目的效果(缩短命名空间名称)就很明显了。

简单总结一下:

namespace就是划分领域的作用,代表这些东西是属于某个命名空间下的。


相信看了这些案例你已经掌握了方法,更多精彩请关注php中文网其它相关文章!

相关阅读:

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!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!