• 命名空间 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

  • 相关阅读:
    Python标准库:内置函数dict(**kwarg)
    如何把 excel 的数据导入到数据库里面去
    正在载入数据中效果
    站点公司亚马逊砸了10亿也没能做成智能手机,技术是须要沉淀和积累的
    零积分下载,2014年辛星mysql教程秋季版第一本已经完工,期待您的支持
    【C语言】在两个数成对出现的数组中找到一个单独的数。
    3.跟我学solr---使用solrj加入索引
    使用CAShapeLayer的path属性与UIBezierPath画出扫描框
    UI设计四要素
    swift 工作日志
  • 原文地址:https://www.cnblogs.com/aten/p/8274522.html
Copyright © 2020-2023  润新知