zoukankan      html  css  js  c++  java
  • PHP命令空间namespace及use的用法

    使用namespace的目的

    命名空间将代码划分出不同的空间(区域),每个空间的常量、函数、类(为了偷懒,我下边都将它们称为元素)的名字互不影响, 这个有点类似我们常常提到的'封装'的概念。

    团队合作项目时,避免与团队其它成员新建的类发生冲突;个人负责项目时,避免前后新建的类发生冲突;

    据个人理解,用到所需要的类时,需要先require或include引入,所以会发生类重定义的错误的前提是:两个相同命名的类都有被引入。目前有些php框架会自动加载(即include)所有新建的model类,所以为了避免你新建的model类和项目框架原生的核心类发生重名冲突,采用了namespace。(想了想,与团队成员新建的类产生冲突应该通过沟通避免,即使事发后也应该重新调整类名即时维护,避免后期造成因为对类的理解混淆而带来维护上的复杂度提高)

    namespace的使用方法

    1、namespace后命名的定义不区分大小写;一个PHP文件客房多个命名空间,第一个命名空间前不能有代码;namespace建议用类名

    2、没有定义命名空间,就理解为使用顶级命名空间。new类时,可以在类前加上反斜杠\,也可以不加。

    //1.php   
    class Person{
        function __construct(){
                echo 'I am one!';
            }
    }
    //name.php
    require_once './1.php';
    
    new Person();     //输出 I am one!;
    new Person(); //输出 I am one!;

    3、 new类时,当前定义了命名空间时,类名一定用反斜杠字符。

    myday.php
    <?php
    class myday
    {
        function mda(){
            echo "今天是星期五";
        }
    }
    Anlis.php
    <?php
    namespace one;
    require('myday.php');
    $day = new myday();

    这是因为当前已经定义了命名空间,如果new时类名不加“”,它会默认加上one命名空间,会报以下错误:

    Fatal error: Class 'onemyday' not found in C:phpStudyPHPTutorialWWW	estyidian
    amespaceAnlis.php on line 5

    4、 根命名空间和子命名空间

    命名空间的调用语法像文件路径一样是有道理的,它允许我们自定义子空间来描述各个空间之间的关系。当前命名下调用别的命名空间的类时,使用了一种像文件路径的语法: 空间名元素名(类名)。

    当然,也可以使article和message board这两个模块其实都是处于同一个blog项目内。如果用命名空间来表达它们的关系,是这样:

    <?php
    //我用这样的命名空间表示处于blog下的article模块
    namespace BlogArticle;
    
    class Comment { }
    
    //我用这样的命名空间表示处于blog下的messageBoard模块
    namespace BlogMessageBoard;
    
    class Comment { }
    
    //调用当前空间的类
    $comment = new Comment();
    
    //调用BlogArticle空间的类
    $article_comment = new BlogArticleComment();
    ?>

    而且,子空间还可以定义很多层次,比如说 BlogArticleArchivesDate

    使用use的目的

    在命名空间字符串过长时,使用use可以相应的缩短命名空间。

    use的使用方法

    1、new类时,最前面无需用反斜杠。此外,use后没有as时,别名默认为最后一个反斜杠后的内容

    <?php
    namespace animaldog;
    class Life{
        function __construct(){
            echo 'dog life!<br>';
        }
    }
    
    namespace animalcat;
    class Life{
        function __construct(){
            echo 'cat life!<br>';
        }
    }
    
    //没有使用use
    new Life(); //按照代码执行顺序,这里默认animalcat这个命名空间;输出:cat life! new animaldogLife(); //输出:dog life! //使用use use animaldog; new dogLife(); //输出:dog life! use animaldog as d; //定义别名:d new dLife(); //输出:dog life!

    使用use和没有使用use区别

    (1)、使用了use在当前命名空间下调用别的命名空间的元素,不加“”也不会默认加上当前命名空间。

    (2)、没使用use时,不加“”也会默认加上当前命名空间。

    2、namespace后面不建议加类名,但use可以。

    namespace animaldog;
    class Life{
        function __construct(){
            echo 'dog life!';
        }
    }
    
    namespace animalcat;
    class Life{
        function __construct(){
            echo 'cat life!';
        }
    }
    
    use animaldogLife as dog;
    new dog();//输出:dog life!

    如上所示,use后加上类名后,就相当于把类改了个名称:由Life改为dog了。

    注:如果上面不用as dog就会报错。因为命名空间cat下也有个一样名称的Life类,可以理解为,使用use后,这个昵称对应的类只能归当前命名空间占有,其它命名空间下不允许存在该类,所以use后加上类名必须加上as才不会报错。

     总结:

    1、namespace就是划分领域的作用,代表这些东西是属于某个命名空间下的。

    2、use就是起小名的作用,不论写起来还是说起来都可以省不少事儿。

     原文链接:https://www.cnblogs.com/drunkhero/p/namespace.html

  • 相关阅读:
    用word2010发个blog
    停止调试无法关闭控制台
    D11.5.8,Lingo中不支持AS3的ExternalInterface接口
    Lingo03 通用脚本和自定义handler
    Lingo01 术语
    Lingo09 Sprite
    Lingo动态创建script member
    tut11脚本基础
    诡异失败的导入对话框
    Lingo3D01 3D Cast Member的组成
  • 原文地址:https://www.cnblogs.com/bushui/p/11486689.html
Copyright © 2011-2022 走看看