Définition et utilisation de l'espace de noms en PHP (exemples détaillés)

WBOY
Libérer: 2023-04-10 18:22:01
original
4400 Les gens l'ont consulté

Dans l'article précédent, je vous ai présenté "Comment obtenir l'héritage de classe PHP ?" (Partage de résumé) ", qui présente en détail les connaissances pertinentes sur l'héritage dans les classes PHP. Dans cet article, nous continuerons d'examiner les connaissances pertinentes sur les espaces de noms PHP. J'espère que cela sera utile à tout le monde !

Définition et utilisation de l'espace de noms en PHP (exemples détaillés)

L'espace de noms est en fait un concept abstrait. Par exemple, dans notre vie quotidienne, les répertoires du système d'exploitation sont utilisés pour regrouper les fichiers associés. Pour les fichiers du répertoire, il joue le rôle d'espace de noms.

Alorsqu'est-ce qu'un espace de noms ? En fait, l'espace de noms peut être compris comme une méthode d'encapsulation d'objets. Les classes, fonctions et constantes en PHP ne peuvent pas avoir le même nom afin d'éviter qu'elles portent le même nom et de résoudre le problème du même nom entre les trois. , les espaces de noms doivent être utilisés.

En PHP, les espaces de noms sont principalement utilisés pour résoudre les conflits de noms entre le code écrit par l'utilisateur et les classes, fonctions et constantes internes ou tierces de PHP. Lorsqu'il y a trop de fichiers, il y a toujours la possibilité de noms en double et pour. Créez un nom très court pour un nom d'identifiant long, ce qui améliorera la lisibilité du code.

Alors, comment un espace de noms est-il déclaré, c'est-à-dire défini et utilisé ? Voyons ensuite comment définir l’espace de noms !

Définir l'espace de noms

En PHP, tout code correct peut être inclus dans l'espace de noms, mais seules les classes, fonctions, constantes et autres types de code seront affectés par l'espace de noms.

Nous utilisons le mot-clé namespace pour compléter la définition de l'espace de noms. Son format de syntaxe est le suivant : namespace关键字来完成命名空间的定义,它的语法格式如下:

namespace 命名空间名;
Copier après la connexion

示例如下:

<?php  
// 定义代码在 &#39;named&#39; 命名空间中  
namespace named;    //在这里可以不使用大括号
 
// ... 代码 ...  
?>
Copier après la connexion
  • 定义两个命名空间:

<?php
namespace MyProject {    //这里建议大家使用大括号,这里定义了一个名为MyProject的命名空间
    const CONNECT_OK = 1;
    class Connection { /* ... */ }
    function connect() { /* ... */  }
}
namespace Another {   //这里定义了一个名为Another的命名空间
    const CONNECT_OK = 1;
    class Connection { /* ... */ }
    function connect() { /* ... */  }
}
?>
Copier après la connexion
  • 定义子命名空间

PHP中的命名空间与目录和文件的关系是很像的,可以允许指定层次化的命名空间名称。因此,命名空间的名字可以使用分层次的方式来定义,它的语法格式如下:

namespace App\Model;
namespace App\Controller\Home;
Copier après la connexion

示例如下:

<?php
namespace MyProject\Sub\Level;  //声明分层次的单个命名空间
const CONNECT_OK = 1;
class Connection { /* ... */ }
function Connect() { /* ... */  }
?>
Copier après la connexion

在上述事例中,创建了常量 MyProjectSubLevelCONNECT_OK,类 MyProjectSubLevelConnection 和函数 MyProjectSubLevelConnect

  • 在同一个文件中,定义多个命名空间

我们有两种语法格式可以在一个文件中定义多个命名空间,示例如下:

首先就是简单的语法组合

<?php
    namespace named;
    const CONNECT_OK = 1;
    class className {
        /* ... */
    }
    namespace names;
    const CONNECT_OK = 1;
    class className {
        /* ... */
    }
?>
Copier après la connexion

然后就是大括号{}

<?php
    namespace named{
        const CONNECT_OK = 1;
        class className {
            /* ... */
        }
    }
    namespace names{
        const CONNECT_OK = 1;
        class className {
            /* ... */
        }
    }
?>
Copier après la connexion

通过上述的介绍,我们已经知道了应该如何定义命名空间,只是定义命名空间还不够,我们在PHP中使用它才是比较重要的,那接下来看一下应该如何使用命名空间。

使用命名空间

在了解应该如何使用命名空间之前,我们应该要了解的是在PHP中是怎么知道要是用哪一个命名空间中的元素的,这时候我们就需要知道PHP中命名空间元素访问的原理了。首先PHP中的我们不太清楚,但是文件系统我们可以总结出访问文件的三种方式:

相对文件名、相对路径名和绝对路径名。

PHP命名空间的元素只用同样的原理,例如命名空间下的类名可以通过三种方式引出:

  • 非限定名称,或不包含前缀的类名称,例如$a = new test()或者test,如果当前命名空间是currentnamespace,那么test将被解析为currentnamespacetest。如果test的代码是全局的,不包含任何命名空间中的代码,那么test会被解析为test。

  • 限定名称,或包含前缀名称,例如$a = new subnamespacetest(),如果当前命名空间是currentnamespace,则 test 会被解析为 currentnamespacesubnamespacetest,如果test的代码是全局的,不包含任何命名空间中的代码,那么test会被解析为subnamespacefoo

  • 完全限定名称,或包含了全局前缀操作符的名称,例如$a = new currentnamespacetest(),这种情况下,test 总是被解析为代码中的文字名 currentnamespacetest

下面是一个使用这三种方式的实例,我们需要两个 PHP 源文件,分别是 demo.php index.php,示例代码如下:

<?php
    namespace Test\Bar\Demo;
    const FOO = 1;
    function foo() {}
    class foo
    {
        public function demo() {
            echo &#39;命名空间为:Test\Bar\Demo&#39;;
        }
    }
?>
Copier après la connexion
<?php
    namespace Foo\Bar;
    include &#39;Demo.php&#39;;
    const FOO = 2;
    function foo() {
        echo &#39;Foo\Bar 命名空间下的 foo 函数<br>&#39;;
    }
    class foo
    {
        static function demo(){
            echo &#39;命名空间为:Foo\Bar<br>&#39;;
        }
    }
    /* 非限定名称 */
    foo();                  // 解析为 Foo\Bar\foo resolves to function Foo\Bar\foo
    foo::demo();            // 解析为类 Foo\Bar\foo 的静态方法 staticmethod。
    echo FOO.&#39;<br>&#39;;        // 解析为常量 Foo\Bar\FOO
    /* 限定名称 */
    Demo\foo();             // 解析为函数 Foo\Bar\Demo\foo
    Demo\foo::demo();       // 解析为类 Foo\Bar\Demo\foo,
                            // 以及类的方法 demo
    echo Demo\FOO.&#39;<br>&#39;;   // 解析为常量 Foo\Bar\Demo\FOO
                                     
    /* 完全限定名称 */
    \Foo\Bar\foo();         // 解析为函数 Foo\Bar\foo
    \Foo\Bar\foo::demo();   // 解析为类 Foo\Bar\foo, 以及类的方法 demo
    echo \Foo\Bar\FOO.&#39;<br>&#39;; // 解析为常量 Foo\Bar\FOO
?>
Copier après la connexion

在上述事例中,我们需要注意的是,访问任意全局类、函数或常量,都可以使用完全限定名称,例如 strlen()Exception

use 命名空间 as 别名;
Copier après la connexion
Copier après la connexion

L'exemple est le suivant : 🎜🎜
<?php
    namespace foo;
    use My\Full\Classname as Another;
    // 下面的例子与 use My\Full\NSname as NSname 相同
    use My\Full\NSname;
    // 导入一个全局类
    use ArrayObject;
    // 导入一个函数
    use function My\Full\functionName;
    // 导入一个函数并定义别名
    use function My\Full\functionName as func;
    // 导入一个常量
    use const My\Full\CONSTANT;
    $obj = new namespace\Another;   // 实例化 foo\Another 对象
    $obj = new Another;             // 实例化 My\Full\Classname 对象
    NSname\subns\func();            // 调用 My\Full\NSname\subns\func 函数
    $a = new ArrayObject(array(1)); // 实例化 ArrayObject 对象
                                    // 如果不使用 "use \ArrayObject" ,则实例化一个 foo\ArrayObject 对象
    func();                         // 调用 My\Full\functionName 函数
    echo CONSTANT;                  // 打印 My\Full\CONSTANT 常量
?>
Copier après la connexion
Copier après la connexion
  • 🎜🎜Définissez deux espaces de noms : 🎜🎜🎜
rrreee
  • 🎜🎜Définissez le sous -namespaces🎜 🎜
🎜La relation entre les espaces de noms en PHP est très similaire à celle des répertoires et des fichiers, vous permettant de spécifier des noms d'espaces de noms hiérarchiques. Ainsi, le nom de l'espace de noms peut être défini de manière hiérarchique, et son format de syntaxe est le suivant : 🎜🎜rrreee🎜L'exemple est le suivant : 🎜🎜rrreee🎜Dans l'exemple ci-dessus, la constante MyProjectSubLevelCONNECT_OK, la classe MyProjectSubLevelConnection et la fonction MyProjectSubLevelConnect🎜
  • 🎜🎜Dans le même fichier, définissez plusieurs espaces de noms🎜🎜🎜
🎜Nous avons deux formats de syntaxe qui peut être utilisé dans un Plusieurs espaces de noms sont définis dans le fichier. L'exemple est le suivant : 🎜🎜🎜Le premier est une combinaison de syntaxe simple 🎜🎜rrreee🎜Ensuite, il y a des accolades {}🎜🎜rrreee🎜Grâce à l'introduction ci-dessus, nous Je sais déjà comment définir un espace de noms, il ne suffit pas de définir un espace de noms. Ce qui est plus important, c'est la façon dont nous l'utilisons en PHP. Voyons ensuite comment utiliser les espaces de noms. 🎜🎜🎜🎜Utilisation des espaces de noms🎜🎜🎜🎜🎜Avant de comprendre comment utiliser les espaces de noms, nous devons comprendre comment savoir quel élément de l'espace de noms utiliser en PHP. À ce stade, nous devons connaître le principe d'accès aux éléments d'espace de noms en PHP. Tout d'abord, nous ne savons pas grand chose sur PHP, mais nous pouvons résumer les trois façons d'accéder aux fichiers dans le système de fichiers : 🎜🎜🎜nom de fichier relatif, nom de chemin relatif et nom de chemin absolu. 🎜🎜Les éléments de l'espace de noms PHP utilisent uniquement le même principe. Par exemple, le nom de la classe sous l'espace de noms peut être introduit de trois manières : 🎜
  • 🎜 🎜Nom non qualifié 🎜, ou nom de classe sans préfixe, tel que $a = new test() ou test, si l'espace de noms actuel est currentnamespace , Ensuite, le test sera analysé comme currentnamespacetest. Si le code de test est global et ne contient aucun code dans l'espace de noms, alors test sera analysé comme test. 🎜
  • 🎜🎜Nom qualifié🎜, ou contenant un nom de préfixe, tel que $a = new subnamespacetest(), si l'espace de noms actuel est currentnamespace , alors test sera analysé comme currentnamespacesubnamespacetest Si le code de test est global et ne contient aucun code dans l'espace de noms, alors test sera analysé comme subnamespacefoo. 🎜
  • 🎜🎜nom pleinement qualifié🎜, ou un nom qui inclut un opérateur de préfixe global, tel que $a = new currentnamespacetest(), auquel cas test est toujours Résout à un nom littéral dans le code currentnamespacetest. 🎜
🎜Ce qui suit est un exemple d'utilisation de ces trois méthodes. Nous avons besoin de deux fichiers sources PHP, à savoir demo.php et index.php</ code>. , l'exemple de code est le suivant : 🎜rrreeerrreee🎜Dans l'exemple ci-dessus, nous devons noter que pour accéder à n'importe quelle classe, fonction ou constante globale, vous pouvez utiliser un nom complet, tel que <code>strlen()</code > ou <code>Exception etc. 🎜

别名、导入

PHP 允许通过别名引用或导入的方式来使用外部的命名空间,这是命名空间的一个重要特征。

在PHP中,通过use关键字和as配合可以实现命名空间的导入和设置别名。它的语法格式如下:

use 命名空间 as 别名;
Copier après la connexion
Copier après la connexion

示例如下:

<?php
    namespace foo;
    use My\Full\Classname as Another;
    // 下面的例子与 use My\Full\NSname as NSname 相同
    use My\Full\NSname;
    // 导入一个全局类
    use ArrayObject;
    // 导入一个函数
    use function My\Full\functionName;
    // 导入一个函数并定义别名
    use function My\Full\functionName as func;
    // 导入一个常量
    use const My\Full\CONSTANT;
    $obj = new namespace\Another;   // 实例化 foo\Another 对象
    $obj = new Another;             // 实例化 My\Full\Classname 对象
    NSname\subns\func();            // 调用 My\Full\NSname\subns\func 函数
    $a = new ArrayObject(array(1)); // 实例化 ArrayObject 对象
                                    // 如果不使用 "use \ArrayObject" ,则实例化一个 foo\ArrayObject 对象
    func();                         // 调用 My\Full\functionName 函数
    echo CONSTANT;                  // 打印 My\Full\CONSTANT 常量
?>
Copier après la connexion
Copier après la connexion

其中需要注意的是,导入操作只影响非限定名称和限定名称。完全限定名称由于是确定的,故不受导入的影响。

大家如果感兴趣的话,可以点击《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