php - namespace篇

以前没有系统学习过PHP语言,直接上手TP框架了,因此认为namespaceuseTP框架的一部分,最近学习语言模块的时候遇到了这个问题,因此汇总了一下。php

PHP中命名空间能够解决两类问题:

  • 用户编写的代码与PHP内部的类、函数、常量或第三方类、函数、常量之间的名字冲突。
  • 为很长的标识符名称(一般是为了缓解第一类问题而定义的)建立一个别名,提升代码的可读性。

在没定义命名空间的状况下,全部的常量、类、函数等都在全局空间下。框架

命名空间

经过关键字namespace声明。能够在同一个文件中定义不一样的命名空间代码,全局的非命名空间代码与命名空间中的代码经过大括号的形式能够组合在一块儿函数

<?php
# 命名空间TestA
namespace TestA{
    class TestA{}
    function test(){}
}

# 命名空间TestB
namespace TestB{
    class TestB{}
    function test(){}
}

# 全局的非命名空间
namespace{
    class TestC{}
    function test(){}
}

子命名空间
与目录和文件的关系很像,PHP命名空间也容许指定层次的命名空间的名称学习

<?php
namespace a\b\Test; 

?>

命名空间的引入

经过关键字use引入,经过as定义别名spa

引入命名空间三种状况:
非限定名称,或不包含前缀的类名称。在命名空间为a下,使用$a = new foo();表明引用的是a\foo。在命名空间为全局的状况下,使用该方法则引用的是foo
限定名称,或包含前缀的名称。在命名空间为a下,使用$a = new b\foo();代码引入的是a\b\foo。在命名为全局的状况下,使用该方法引入的是b\foo
彻底限定名称,或包含了全局前缀操做符的名称。在命名空间为a下,$a = new \c\b\foo();这种状况下,老是引入为c\b\foor文件code

上述三种方式其实就是文件路径中绝对路径和相对路径。字符串

注意:访问任意全局类、函数或变量,均可以使用彻底限定名称,例如\strlen()或者\Exceptionio

<?php
namespace foo;

use \A\B\TestA;    #导入命名空间
use \A\B\TestB as TB;    #导入命名空间,并别名为TB

?>

namespace__NAMESPACE__魔术常量

namespace用于定义命名空间,__NAMESPACE__是包含当前命名空间的字符串,在全局的状况下,它是一个空字符串''function

相关文章
相关标签/搜索