加入收藏 | 设为首页 | 会员中心 | 我要投稿 聊城站长网 (https://www.0635zz.com/)- 智能语音交互、行业智能、AI应用、云计算、5G!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

如何掌握PHP命名空间的基础运用

发布时间:2023-06-09 13:54:21 所属栏目:PHP教程 来源:
导读:这篇文章主要介绍“如何掌握PHP命名空间的基础使用”的相关知识,下面会通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“如何掌握PHP命名空间的基础使用”文章能帮助大
这篇文章主要介绍“如何掌握PHP命名空间的基础使用”的相关知识,下面会通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“如何掌握PHP命名空间的基础使用”文章能帮助大家解决问题。
 
在讨论如何使用命名空间之前,必须了解 PHP 是如何知道要使用哪一个命名空间中的元素的。可以将 PHP 命名空间与文件系统作一个简单的类比。在文件系统中访问一个文件有三种方式:
 
相对文件名形式如foo.txt。它会被解析为 currentdirectory/foo.txt,其中 currentdirectory 表示当前目录。因此如果当前目录是 /home/foo,则该文件名被解析为/home/foo/foo.txt。
 
相对路径名形式如subdirectory/foo.txt。它会被解析为 currentdirectory/subdirectory/foo.txt。
 
绝对路径名形式如/main/foo.txt。它会被解析为/main/foo.txt。
 
PHP 命名空间中的元素使用同样的原理。例如,类名可以通过三种方式引用:
 
非限定名称,或不包含前缀的类名称,例如 $a=new foo(); 或 foo::staticmethod();。如果当前命名空间是 currentnamespace,foo 将被解析为currentnamespace\foo。如果使用 foo 的代码是全局的,不包含在任何命名空间中的代码,则 foo 会被解析为foo。 警告:如果命名空间中的函数或常量未定义,则该非限定的函数名称或常量名称会被解析为全局函数名称或常量名称。
 
限定名称,或包含前缀的名称,例如 $a = new subnamespace\foo(); 或 subnamespace\foo::staticmethod();。如果当前的命名空间是 currentnamespace,则 foo 会被解析为 currentnamespace\subnamespace\foo。如果使用 foo 的代码是全局的,不包含在任何命名空间中的代码,foo 会被解析为subnamespace\foo。
 
完全限定名称,或包含了全局前缀操作符的名称,例如, $a = new \currentnamespace\foo(); 或 \currentnamespace\foo::staticmethod();。在这种情况下,foo 总是被解析为代码中的文字名(literal name)currentnamespace\foo。
 
下面是一个使用这三种方式的实例:
 
file1.php:
 
<?php
 
    namespace Foo\Bar\subnamespace;
 
    const FOO = 1;
 
    function foo() {}
 
    class foo
 
    {
 
        static function staticmethod() {}
 
    }
 
?>
 
file2.php:
 
<?php
 
    namespace Foo\Bar;
 
    include 'file1.php';
 
    const FOO = 2;
 
    function foo() {}
 
    class foo
 
    {
 
        static function staticmethod() {}
 
    }
 
    /* 非限定名称 */
 
    foo(); // 解析为 Foo\Bar\foo resolves to function Foo\Bar\foo
 
    foo::staticmethod(); // 解析为类 Foo\Bar\foo的静态方法staticmethod。
 
    echo FOO; // resolves to constant Foo\Bar\FOO
 
    /* 限定名称 */
 
    subnamespace\foo(); // 解析为函数 Foo\Bar\subnamespace\foo
 
    subnamespace\foo::staticmethod(); // 解析为类 Foo\Bar\subnamespace\foo,以及类的方法 staticmethod
 
    echo subnamespace\FOO; // 解析为常量 Foo\Bar\subnamespace\FOO
 
    /* 完全限定名称 */
 
    \Foo\Bar\foo(); // 解析为函数 Foo\Bar\foo
 
    \Foo\Bar\foo::staticmethod(); // 解析为类 Foo\Bar\foo, 以及类的方法 staticmethod
 
    echo \Foo\Bar\FOO; // 解析为常量 Foo\Bar\FOO
 
?>
 
注意访问任意全局类、函数或常量,都可以使用完全限定名称,例如 \strlen() 或 \Exception 或 \INI_ALL。
 
Example #1 在命名空间内部访问全局类、函数和常量
 
<?php
 
    namespace Foo;
 
    function strlen() {}
 
    const INI_ALL = 3;
 
    class Exception {}
 
    $a = \strlen('hi'); // 调用全局函数strlen
 
    $b = \INI_ALL; // 访问全局常量 INI_ALL
 
    $c = new \Exception('error'); // 实例化全局类 Exception
 
?>
 
 

(编辑:聊城站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!