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

  • 相关阅读:
    [Golang学习笔记] 06 程序实体3 类型断言和类型转换
    [Golang学习笔记] 05 程序实体2 作用域访问权限和变量重声明
    [Golang学习笔记] 04 程序实体1 变量声明
    [Golang学习笔记] 03 库源码文件
    virgo-tomcat-server的生产环境线上配置与管理
    virgo-tomcat-server最大并发连接数的修改
    linux系统下kvm虚拟机的安装
    关于virgo-tomcat-server-3.6.0.RELEASE配置文件修改说明
    关于在Linux下apache-maven的安装
    H3C系列之三层交换机文件管理
  • 原文地址:https://www.cnblogs.com/aten/p/8274522.html
Copyright © 2011-2022 走看看