• 技术文章 >后端开发 >php教程

    有关于PHP关键特性之命名空间的一些看法!!!

    慕斯慕斯2021-05-28 11:28:19转载629
    你知道命名空间主要是为了解决代码中类和函数可能存在冲突的问题的吗?而这个特性其他语言一早就有,PHP则是姗姗来迟,它的出现催生了 PSR-4 的诞生,从而也催生了 Composer 的兴起,所以是非常重要的特性。

    命名空间的定义

    命名空间是一个容器,这个容器主要是为了识别其下的类和函数。一旦定义了命名空间,它下面的代码就属于这个命名空间了,所以命名空间的定义要在代码的最开始行。

    对于同一个包来说,同一个命名空间或者子命名空间的代码没有必要在一个 PHP 文件中定义,子命名空间下的代码是为了完成特定模块的工作,组合起来就是一个包完整的命名空间。

    假如编写的代码没有定义命名空间,那说明它属于全局的命名空间(\ 符号),所以能够直接引用类或者函数(不用添加 \ 符号)。

    引用命名空间标识符的三种方式

    (1)Fully-qualified name

    类似于操作系统上的绝对路径,而且是完整的路径,所以在理解的时候不会有误解。
    比如在 new \A\B\C ,那么 C 就被会解析到 A\B 命名空间下的 C 类。

    (2)Qualified name

    类似于操作系统上的相对路径,它包含部分名字并被引用到当前的命名空间。
    比如 B\C() 在命名空间 A 下调用,则最终引用的命名空间就是 A\B\C()。

    (3)Unqualified name

    类似于Qualified name,但是没包括子命名空间。
    比如 C() 在命名空间 A\B 下调用,则最终引用的命名空间就是 A\B\C()。

    通过一个例子来说明三种引用方式:

    namespace \Example;
    require_once "fnction.php";
    class ClassA {}
    function Function() {}
    
    //完全限定名称
    \Example\Function();
    \Example\B\Function(); 
    
    //限定名称
    B\Function(); //指向 \Example\B\Function();
    
    //非限定名称
    $test = new ClassA(); //resolves to \Example\ClassA
    Function(); //指向 \Example\Function

    注意:

    先举个简单的例子,首先编写一段代码(定义在命名空间下),命名为 function.php :

    namespace Foo\Bar\subnamespace;
    const FOO = 1;
    function foo() 
    {
        return "foo\r\n";
    }
    class foo 
    {
        static function staticmethod()
        {
            return __METHOD__ . "\r\n" ;
        }
    
        function foofunction()
        {
            return __METHOD__ . "\r\n" ;
        }
    }

    再编写一段代码 test.php,也是处于命名空间之下的代码:

    namespace secondsp;
    include 'function.php';
    
    class foo
    {
        function foofunction()
        {
            return __METHOD__ . "\r\n" ;
        }
    }
    
    function is_file($file)
    {
        return true ;
    }
     
    //非限定名称:实例化secondsp\foo类对象
    $obj = new foo;  
    echo $obj->foofunction();
    
    //实例化Foo\Bar\subnamespace\foo 类对象
    $obj = new Foo\Bar\subnamespace\foo ;
    echo $obj->foofunction();
    
    //代码会报错,在命名空间内部,假如无法找到当前命名空间下的类,则会报错
    //$obj = new ArrayObject(array(1)); 
    $obj = new \ArrayObject(array(1)); 
    
    //在命名空间内部,假如无法找到当前命名空间下的函数或者常量,则会寻找 native function
    echo  strlen("nihao");
    
     //引用当前命名空间下的函数
    var_dump(is_file('nihao')); //True
    //引用全局函数
    var_dump(\is_file('nihao')); //False

    导入,别名

    假如要使用的命名空间层级很长且数量很多,那么在使用的时候特别麻烦,所以可以使用 use 关键字导入命名空间、类、常量、函数等,然后可以使用它们直接引用完整的名称。而 alias 关键字可以给导入的类和函数等重命名。

    举个例子如何使用 use 关键字,该代码处于全局命名空间之下:

    include 'function.php';
    
    use Foo\Bar\subnamespace\foo ;
    $obj = new foo;
    echo $obj->foofunction();
    
    use Foo\Bar\subnamespace\foo  as aliasfunname;
    $obj = new aliasfunname;
    echo $obj->foofunction();
     
    use Foo\Bar\subnamespace ; 
    $obj = new subnamespace\foo ;
    echo $obj->foofunction();
    
    use Foo\Bar\subnamespace  as aliasname;
    $obj = new aliasname\foo ;
    echo $obj->foofunction();
    
    //由于调用代码并不在命名空间内,所以对于全局的类,无需引入使用
    $obj = new ArrayObject(array(1)); 
    
    //导入一个函数
    use function Foo\Bar\subnamespace\foo   ;
    echo foo();
     
    use function Foo\Bar\subnamespace\foo  as func;
    echo func();
     
    use const  Foo\Bar\subnamespace\FOO;
    //echo FOO;

    总结:

    推荐学习:《PHP视频教程

    以上就是有关于PHP关键特性之命名空间的一些看法!!!的详细内容,更多请关注php中文网其它相关文章!

    声明:本文转载于:简书,如有侵犯,请联系admin@php.cn删除
    专题推荐:PHP PSR-4 Composer
    上一篇:解析PHP Hash信息摘要扩展框架 下一篇:整理常见的PHP算法面试题
    第16期线上培训班

    相关文章推荐

    • 关于php-composer的安装与使用方法(简化版)• 怎么降低composer版本• composer的一些学习和理解

    全部评论我要评论

  • 取消发布评论发送
  • 1/1

    PHP中文网