zoukankan      html  css  js  c++  java
  • 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了。所以,当我们看到一个类名前加上一个,说明该类不存在于任何命名空间之中。

    以上

  • 相关阅读:
    sharding-jdbc精确分片配置
    sharding-jdbc注意事项
    sharding-jdbc绑定表和公共表
    go 语言解析yaml文件作为配置文件
    go语言添加全局的json配置文件
    go查询数据库讲单数据结果绑定结构体
    sharding-jdbc分库分表节点路由
    增强for循环对遍历的集合进行增删改操作会出现并发修改异常
    go语言数据模型改变响应给前端字段名
    视图
  • 原文地址:https://www.cnblogs.com/CyLee/p/6349818.html
Copyright © 2011-2022 走看看