zoukankan      html  css  js  c++  java
  • 命名空间 namespace

    命名空间一个最明确的目的就是解决重名问题,在php里边,同一个应用请求里边如果存在两个方法(类名),他们的名字一样(例如都是getName()),由于php本身语法规则的限制,系统是要报错的
    解决方法:
      ① 把他们的名字改为不一样的 例如  agetName()   bgetName()
      ② 通过命名空间解决
    Yii 框架为了避免名字重复引起问题,同步的类前边都有 C  字样

    1 简单应用

      a) 命名空间是虚拟的定义空间,不是真实存在目录
      b) 命名空间的分隔符都是反斜杠
      c) 非限定名称:getName()  获得与其最近的命名空间的getName()
      d) 限定名称:beijinggetName()  相对方式  通过最近的命名空间定位beijinggetName()
      e) 完全限定名称: eijinggetName()  直接在指定的命名空间获得具体元素
      f) 命名空间针对:函数、类名、常量三者其作用,在命名空间里边把这三种统称为元素

    <?php 
    // 定义命名空间
    namespace beijing;
    function getNanme(){
        return "hellow";
    }
    // echo getNanme();
    //可以获得上面声明最近的命名空间的getName()
    namespace shenyang;
    function getName(){
        return "shenyang";    
    }
    
    namespace dalian;
    function getName(){
        return "world";
    }
    // echo getName();
    // 非限定名称 获得最近命名空间的getName 输出world
    
    // echo beijinggetName();
    // 限定名称 会认为在当前命名空间里面获取dalianeijinggetName 会报错
    
    // echo eijinggetName();
    // 完全限定名称 会根据命名空间决定使用哪个getName 输出hello

     

    2 子空间应用

    <?php 
    // 子空间使用
    namespace beijinghaidian;
    function getNanme(){
        return "haidian";
    }
    
    namespace hebeihandan;
    function getName(){
        return "handan";    
    }
    
    namespace beijingchaoyang;
    function getName(){
        return "chaoyang";
    }
    
    namespace beijingchangping;
    function getName(){
        return "changping";
    }
    // echo getName();
    //非限定名称 获得最下边的getName输出changping,使用上边的getName需要使用完全限定名称
    
    // echo beijingchaoyanggetName();
    // 限定名称 查找路径beijingchangpingchaoyanggetName() 会报错
    
    // echo hebeihandangetName();
    // 完全限定名称 输出handan

    3 别名和导入

    a)    导入/引入 use
    b)    使用一个元素,使用非限定名称,在当前最接近的空间里边获得元素
    c)    如果当前空间里边没有指定元素,也可以在导入的空间里边寻找

    <?php 
    //use的使用
    namespace beijing;
    function getNanme(){
        return "beijing";
    }
    
    namespace shanghai;
    function getName(){
        return "shanghai";    
    }
    
    class Person{
        static $name="shanghairen";
    }
    
    namespace nanjing;
    function getName(){
        return "nanjing";
    }
    // 第一种 空间和元素一并引入
    use shanghaiPerson;
    echo Person::$name;
    
    // 第二种 只引入空间
    use shanghai;
    echo shanghaiPerson::$name;

    e)    别名应用:
    f)    如果在引入空间的时候也把元素给引入了,在当前的空间里边也有同名字的元素,那么这个外来的元素和内部元素要有冲突,这时可以通过别名定义来重新给外来的元素起名字并使用

    <?php 
    //子空间-引入命名空间应用
    namespace beijingchaoyang;
    class Person{
        static $name = "chaoyangren";
    }
    
    namespace tianjinhexi;
    function getName(){
        return "hexi";    
    }
    class Person{
        static $name="hexiren";
    }
    
    // 引入空间(空间和元素都引入)
    use beijingchaoyangPerson;
    echo Person::$name;
    
    // 引入空间 使用限定名称就可以定位已经引入的空间元素
    use beijingchaoyang;
    echo chaoyangPerson::$name;
    
    // 引入空间和元素(别名使用)
    use beijingchaoyangPerson as pon;
    echo pon::$name;

    4 公共空间

    公共空间有两种情况:
    1.    当前有空间,引入没有空间(公共空间)
    a)    默认使用当前空间的元素
    b)    统一斜杠引入公共空间元素
    2.    当前没有空间(公共空间),引入有空间
    a)    默认调用当前公共空间的元素(非限定名称)
    b)    使用有公共空间的元素  (限定名称、完全限定名称)

    同一个页面里边有许多空间,在页面最下边使用上边空间的元素,名称需要使用完全限定名称,还可以把上边空间的元素给use引入过来也可通过非限定名称或限定名称使用

    <?php 
    //当前没有空间
    // 当前文件没有空间,引入文件有空间
    // 默认空间就是当前空间
    function getName(){
        return "i am first";    
    }
    class Person{
        static $name="firstman";
    }
    
    // 引入带有命名空间的文件
    include "./commom2.php";
    
    echo getName();// i am first
    
    echo getName();//同样 i am first
     
    echo beijinggetName();//common
    echo eijinggetName();//common
    
    use beijingPerson as pon;
    echo pon::$name;

    命名空间使用注意:
    1.    针对类名、函数名、常量const其作用 define()定义的常量不受命名空间限制
    2.    声明namespace的当前脚本的第一个命名空间前面不能有任何代码(header头代码也要写在下边)
    3.    命名空间是虚拟抽象的空间,不是真实存在的目录
    4.    当前文件可以include具有命名空间的文件,默认空间是当前文件的公共空间
    5.    元素调用分:非限定名称、限定名称、完全限定名称

    简单使用:同一个页面定义了许多单级命名空间
    子空间:通过斜杠定义多级命名空间
    公共空间:为了程序比较严谨,公共空间的元素都使用斜杠访问
    空间引入和别名:use   as

  • 相关阅读:
    oracle 导入数据时提示只有 DBA 才能导入由其他 DBA 导出的文件
    oracle 常用语句
    android udp 无法收到数据 (模拟器中)
    android DatagramSocket send 发送数据出错
    AtCoder ABC 128E Roadwork
    AtCoder ABC 128D equeue
    AtCoder ABC 127F Absolute Minima
    AtCoder ABC 127E Cell Distance
    CodeForces 1166E The LCMs Must be Large
    CodeForces 1166D Cute Sequences
  • 原文地址:https://www.cnblogs.com/aten/p/8274522.html
Copyright © 2011-2022 走看看