Maison  >  Article  >  Indispensable pour les débutants pour apprendre les frameworks en 2017 : explication détaillée des espaces de noms dans le didacticiel du framework Thinkphp5

Indispensable pour les débutants pour apprendre les frameworks en 2017 : explication détaillée des espaces de noms dans le didacticiel du framework Thinkphp5

伊谢尔伦
伊谢尔伦original
2017-07-06 09:27:222131parcourir

ThinkPHP est un framework de développement PHP domestique léger, rapide, compatible et simple. L'utilisation de Thinkframework PHP peut grandement simplifier notre processus de développement et gagner du temps. Cet article est destiné au chinois PHP pour aider tout le monde à apprendre un concept très important dans ThinkPHP : espace de noms .

Espace de noms

ThinkPHP adopte la définition de l'espace de noms et le chargement automatique des fichiers de bibliothèque de classe , résolvant efficacement le problème de plusieurs modules et de l'espace de noms du compositeur les conflits entre les bibliothèques de classes sont résolus et un mécanisme de chargement automatique plus efficace pour les bibliothèques de classes est implémenté.

Vous pouvez passer à notre cours de site Web php chinois : Apprenez le didacticiel sur les espaces de noms de programmation PHP du bout des doigts

Notre site Web php chinois des cours vidéo sont également proposés : Tutoriel vidéo Dugu Jiujian (5)_ThinkPHP5

Indispensable pour les débutants pour apprendre les frameworks en 2017 : explication détaillée des espaces de noms dans le didacticiel du framework Thinkphp5

Puisque les fonctions ne sont pas prises en charge dans la Syntaxe PHP Surcharge mécanisme, que se passe-t-il s'il existe deux méthodes portant le même nom dans une application ? Dans le framework Yii, afin d'éviter les problèmes causés par des noms répétés, toutes les classes ont le mot C devant elles, et le concept d'espaces de noms a été introduit dans ThinkPHP. Il y a quelques points qui nécessitent une attention particulière :

a) L'espace de noms est un espace de définition virtuel, pas un véritable répertoire

b) Les délimiteurs de l'espace de noms sont tous des barres obliques inverses

c) L'espace de noms n'est valable que pour les fonctions, les classes et les constantes (constantes définies par const, constantes non définies).

d) Il existe trois méthodes d'accès à l'espace de noms : la méthode d'accès au nom non qualifié ; la méthode d'accès au nom complet ;

Ce qui suit sera expliqué en détail un par un.

1. L'espace de noms n'est valide que pour les fonctions, les classes et les constantes (constantes définies par const, constantes non définies).

Ici nous déclarons deux espaces de noms space1 et space2 , il y a fonction getmsg() avec le même nom, constante a avec le même nom et classe Animal avec le même nom sous les deux espaces de noms Comme ils se trouvent dans des espaces de noms différents, aucune erreur ne se produira. Nous l'ouvrons dans le navigateur et obtenons le résultat suivant : helloworld.

Et si nous essayions de définir deux constantes du même nom en utilisant définir ?

Lors de l'ouverture dans le navigateur, l'erreur suivante est signalée :

L'espace de noms n'est donc valide que pour les fonctions, les classes et les constantes (constantes définies par const, constantes non définies).

2. Espaces de noms à plusieurs niveaux et trois méthodes d'accès

Les espaces de noms space1 et space2 déclarés ci-dessus sont tous deux des espaces de noms à un seul niveau. , un espace de noms sous la forme space1space2space3 est un espace de noms à plusieurs niveaux, et le délimiteur l'est. Trois méthodes d'accès à l'espace de noms sont présentées ci-dessous :

1. Méthode d'accès au nom non qualifié

Lors d'un accès en mode d'accès au nom non qualifié, la fonction sous l'espace de noms actuel est accessible (il en va de même pour les classes et les constantes), donc le résultat de sortie du code ci-dessus est : monde.

2. Méthode d'accès au nom complet

Si vous souhaitez accéder à la méthode getmsg() sous name1space1 dans l'espace de noms name2space2, vous pouvez utilisez l'accès au nom complet (équivalent à l'accès au chemin absolu).

Le résultat du code ci-dessus est donc : bonjour.

3. Méthode d'accès au nom qualifié

La différence entre la méthode d'accès au nom qualifié et la méthode d'accès au nom complet se situe uniquement au niveau devant. Si l'exemple ci-dessus utilise un accès par nom qualifié, remplacez la dernière ligne par : name1space1getmsg();

À ce stade, nous l'ouvrons dans le navigateur et trouvons l'erreur suivante :

Indique que nous ne trouvons pas la fonction getmsg() sous l'espace de noms name2space2name1space1. La raison en est que la méthode d'accès au nom qualifié est équivalente à l'accès au chemin relatif. Nous utilisons la méthode d'accès au nom qualifié dans l'espace de noms actuel pour accéder à : name1space1getmsg(), qui recherchera la fonction getmsg() sous. name1space1 dans l’espace de noms actuel. S’il est introuvable, une erreur sera signalée. Par conséquent, si nous déclarons un autre espace de noms nommé : name2space2name1space1, l'accès ci-dessus peut être exécuté normalement, comme suit :

Le résultat de sortie est : hello-world.

3. Mécanisme d'introduction des éléments d'espace de noms et de classe d'espace

1. Introduction de l'espace de noms

Grâce à l'exemple ci-dessus, nous pouvons voir que si nous voulons utiliser des fonctions, des constantes ou des éléments de classe dans un autre espace de noms dans l'espace de noms actuel, nous devons utiliser un accès pleinement qualifié pour accéder et écrire du code. C'est relativement lourd, donc nous pouvons introduire un espace de noms, puis utiliser un accès par nom qualifié pour simplifier le processus d'accès.

Le résultat de sortie est : bonjour chien

2. Introduire des éléments spatiaux

Semblable à l'introduction d'espaces de noms, utilisez le mot-clé use pour introduire des éléments spatiaux, puis utilisez directement l'accès non qualifié. . Cependant, une classe portant le même nom que la classe introduite ne peut pas exister dans l'espace de noms actuel, sinon une erreur se produira.

Le résultat de sortie est : rhubarbe de chien.

4. Espace public

Si on n'utilise pas le mot-clé namespace pour déclarer un espace de noms, il appartient à l'espace public.

Ici, nous créons deux fichiers php, 1.php et 2.php, 1.espace de noms php est name1space1, 2.php est l'espace public.

1.php :

namespace  name1\space1;
header("content-type:text/html;charset=utf-8");
class Animal
{
    public $obj = 'dog';
    static $name = '大黄';
}
function getmsg()
{
    echo 'hello';
}

const MN = 123;

//在命名空间中引入公共命名空间

include ('./2.php');

getmsg();       //访问的是当前空间下的getmsg()函数
echo &#39;</br>&#39;;
\getmsg();      //访问的是公共命名空间(即2.php文件)下的getmsg()函数

echo &#39;</br>&#39;;
echo MN;          //会先在当前命名空间下寻找MN常量,如果找到就输出,如果找不到,就会去公共命名空间寻找MN常量
echo &#39;</br>&#39;;
echo  \MN;         //访问的是公共命名空间(即2.php文件)下的MN常量

2.php :

//没有指定命名空间,则其属于公共命名空间
function getmsg()
{
    echo 'world';
}

const MN = '456';

dans le navigateur Ouvrir 1.php, le résultat de sortie est :

hello
world
123
456

5. L'espace de noms est un espace de définition virtuel, pas une existence réelle Répertoire

Dans thinkphp5.0, l'espace de noms est un espace de définition virtuel, pas un véritable répertoire. C'est juste que lorsque le responsable a déclaré l'espace de noms, le nom de l'espace de noms correspondait délibérément à la structure de répertoire.

Par exemple, nous ouvrons le fichier Index.php sous le dossier application/index/controller, son espace de noms est : appindexcontroller. n'existe pas dans la structure des répertoires.

Alias ​​d'espace de noms

Le framework permet de définir des alias pour les espaces de noms, par exemple :

namespace app\index\model;
use think\Model;
class User extends Model
{
}

La méthode d'appel d'origine dans le contrôleur est :

namespace app\index\controller;
use app\index\model\User;
class Index
{
 public function index()
 {
  $user = new User();
 }
}

Si nous enregistrons l'alias de l'espace de noms dans le fichier public de l'application comme suit :

\think\Loader::addNamespaceAlias(&#39;model&#39;,&#39;app\index\model&#39;);

Ensuite, le code du contrôleur ci-dessus peut être modifié en :

namespace app\index\controller;
use model\User;
class Index
{
 public function index()
 {
  $user = new User();
 }
}

相关资料推荐: 

1. 什么是php命名空间?命名空间用法实例详解

2. php命名空间与自动加载类用法实例详解

3. php关于use、命名空间、引入类文件和自动加载类的实例详解

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