• PHP 命名空间namespace 和 use


    慕课网教程:

    http://www.imooc.com/video/7834

     

    PHP 中命名空间的概念和高级语言(如C#、JAVA)有很大的差异,一度让我混淆甚至怀疑它存在的意义和目的。

    今天找时间学习了一下才明白它的作用:防止类名(class)重复

     

    我们从一个简单的demo来学习一下命名空间;

    先分别新建两个简单的类文件,并且故意让类名重复;

     

    a.php

    # a.php
    <?php 
    class Apple {
        public function get_info(){
            echo "a";
        }
    }

     

    b.php

    #b.php
    <?php 
    class Apple {
        public function get_info(){
            echo "b";
        }
    }

     

    再新建一个测试页面index.php,分别引用两个类文件

    <?php 
    
    require_once 'a.php';
    require_once 'b.php';
    
    $a = new Apple;
    $a->get_info();

     

    打开页面后你会看到报错咯:

     

     

    原因很明显就是类名冲突了,那改一下类名不就得了?是的,但某些场景下,我们可能避免不了发生这样的冲突。

    PHP给我们提供的解决方案就是命名空间(namespace

     


    PHP中的命令空间作用,有点像将类放入不同的文件夹中(如ac 或者 def)管理,这样一来,不同命名空间下的类就不会互相影响了。因为编译器会认为他们不是同一个类。写法如下:

    <?php 
    namespace ac;
    class Apple { public function get_info(){ echo "a"; } }

     

    再次打开index.php页面发现错误消失了,并且输出了b。说明了使用了b的Apple类

    如果我想使用a的Apple类应该如何做呢?在index.php中使用 use 关键字,指定我们要使用ac命名空间下的Apple类,代码如下:

    <?php 
    # 让编译器知道下列的new Apple都是使用ac命名空间下的类
    use acApple;
    
    require_once 'a.php';
    require_once 'b.php';
    
    $a = new Apple;  // 等同于 $a = new acApple
    
    $a->get_info();

    打开index.php,页面成功输出了a 

    再来探讨另一种情况,如果b的Apple类也存在于命名空间下: 

    <?php 
    
    namespace def;
    
    class Apple {
        public function get_info(){
            echo "b";
        }
    }

    那么我在index.php中就算使用 use defApple 很显然会替换掉了use acApple;这个时候可以使用 AS 关键字 用来设置别名

    代码如下: 

    <?php 
    
    use acApple;
    use defApple as bApple;
    
    require_once 'a.php';
    require_once 'b.php';
    
    $a = new Apple;
    $a->get_info();
    
    $b = new bApple();
    $b->get_info();

    打开页面就可以看到成功输出了b,并且这个时候使用a的Apple类也不会影响输出a

    再来看最后一种情况,如果现在添加一个类文件c.php

    <?php 
    
    class Apple {
        public function get_info(){
            echo "c";
        }
    }

    c的Apple类没有放置在任何的命名空间下,那么在Index.php中又应该如何使用而不和a、c冲突呢,很简单,在Apple类前加一个即可作为最高权限。代码如下:

    <?php 
    use acApple;
    use defApple as bApple;
    
    require_once 'a.php';
    require_once 'b.php';
    require_once 'c.php';
    
    $a = new Apple;
    $a->get_info();
    
    $b = new bApple();
    $b->get_info();
    
    
    $c = new Apple();  
    $c->get_info();

     打开页面即可正常输出abc了。所以,当我们看到一个类名前加上一个,说明该类不存在于任何命名空间之中。

    以上

  • 相关阅读:
    go语言从零学起(三) -- chat实现的思考
    go语言从零学起(二)--list循环删除元素(转载)
    go语言从零学起(一) -- 文档教程篇
    Spring框架事务支持模型的优势
    Thymeleaf
    社保到底是多交好,还是少交好?
    使用静态工厂方法而不是构造器
    EJB、RMI、XMLRPC、Hessian、Thrift 、Protobuf
    MySQL存储过程
    MySQL常用功能语句分类总结
  • 原文地址:https://www.cnblogs.com/CyLee/p/6349818.html
Copyright © 2020-2023  润新知