美文网首页PHP Chaos我爱编程
PHP 现代开发基础知识: 命名空间 - namespace

PHP 现代开发基础知识: 命名空间 - namespace

作者: xiaojianxu | 来源:发表于2016-10-08 15:12 被阅读125次

    目录

    1. 为什么使用命名空间
    2. 使用命名空间

    为什么使用命名空间

    目的,就是为了避免出现命名冲突,导致 PHP 运行失败。
    同一个开发团队中,这个命名冲突,可以通过项目管理规范来避免。可是,随着 PHP 项目的不断演变,一个项目代码也会不断增多,PHP 社区也积累了很多的优秀代码包。现代 PHP 项目中,我们就可以直接使用这些现成的代码包,减少开发工作量,缩短开发周期,更少的 bug,更快的系统性能。

    正是,因为引入了第三方代码包,而这些代码包中:类(class), 接口(interface),函数 (function) 和 常量 (constant) 都是无法控制的。那么,命名空间的就显得不可或缺。

    具体命名空间例子:

    namespace Jamesxu\Component;

    命名空间的声明,总是出现单独一行出现在 <?php 标签之后。上面代码的意思是,类是定义/生存在 Component 子命名空间下。

    一个命名空间包含与组织了相关的 PHP 类,如同一个文件系统包含相关的文件。

    声明
    每个 PHP 类,接口,函数/方法,与参数都是存在于一个命名空间(或子命名空间)。
    命名空间,以单独一行出现在 PHP 开标签 <?php 之后。

    格式是:namespace 空格字符 命名空间名字; (; 代表结束)

    namespace 通常用来声明一个 top-level vendor name,如:

    <?php
    namespace Jamexu;
    所有 PHP class,interface, functions, or constant 声明都在该命名空间下。可以使用子命名空间来组织代码。

    子命名空间的声明也和前面相同,唯一不同的是命名空间与子命名空间使用 \ 字符分隔。

    在命名空间下,声明名为 ModernPHP子命名空间:

    <?php
    namespace Jamesxu\ModernPHP;

    引用和别名

    使用别名,可以不需要输入整个命名空间。

    Example 2-1. Namespace without alias

    没有别名的命名空间
    <?php
    $response = new \Symfony\Component\HttpFoundation\Response('Oops', 400);
    $response->send();

    Example 2-2. Namespace with default alias

    具有默认别名的命名空间
    <?php
    use Symfony\Component\HttpFoundation\Response;

    $response = new Response('Oops', 400);
    $response->send();

    tell PHP we intend to use the Symfony\Component\HttpFoundation\Response class with the use keyword.

    Example 2-3. Namespace with custom alias

    自定义别名( as Res)
    <?php
    use Symfony\Component\HttpFoundation\Response as Res;
    $r = new Res('Oops', 400);
    $r->send();

    use Symfony\Component\HttpFoundation\Response as Res; 导入 Response 类,并使用 Res 作为 Response 类的别名。如果不追加 as Res,PHP 默认将使用导入的类名作为别名

    总结:

    1. use 关键词必须要写在 PHP 文件的头部,在标签 <?php 或 namespace 声明之后;
    2. 使用 use 来倒入代码时,不需要以 \ 字符作为开始,PHP 默认命名空间是 fully qualified;
    3. use 必须要存在于全局作用域中,而不是在一个类或方法中,因为需要在编译时使用到。可以在命名空间的声明下,使用 use 导入代码。

    引入函数与常量

    use func

    <?php
    use funs Namesoace\functionName;
    functionName();

    use constant

    <?php
    use constant Namesoace\CONST_NAME;
    echo CONST_NAME;

    多行导入

    <?php
    use Symfony\Component\HttpFoundation\Request;
    use Symfony\Component\HttpFoundation\Response;
    use Symfony\Component\HttpFoundation\Cookie;

    全局命名空间 (Global Namespace)

    使用一个没有命令空间的类,接口,方法,或常数时,PHP 默认把类,接口,方法,或常数当作存在于当前命名空间来处理。

    在另一个命名空间中,引用一个命名空间的类,接口,方法,或常量,必须要使用 fully qualified PHP class name (namespace + class name)。既可以输入 fully qualified PHP class name,或用 use 导入。

    在另一个命名空间中,使用全局变量代码,只需要在 class,interface,function,or constant 前添加 \ 字符。

    Example 2-4. Unqualified class name inside another namespace

    <?php
    namespace My\App;

    class Foo
    {
    public function doSomething()
    {
    /*
    Fails, because PHP searches for a \My\App\Exception >class that does not exist.
    */
    $exception = new Exception();
    }
    }

    添加 \ 做前缀,PHP 将 Exception 类作为全局命名空间来处理

    <?php
    namespace My\App;

    class Foo
    {

    public function doSomething()
    {
    // add a \ prefix the Exception class name
    // It tells PHP to look for the Exception class in the global >namespace instead of the current
    // namespace.
    throw new \Exception();
    }
    }

    相关文章

      网友评论

        本文标题:PHP 现代开发基础知识: 命名空间 - namespace

        本文链接:https://www.haomeiwen.com/subject/rzbqyttx.html