以前没有系统学习过PHP
语言,直接上手TP
框架了,因此认为namespace
和use
是TP
框架的一部分,最近学习语言模块的时候遇到了这个问题,因此汇总了一下。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()
或者\Exception
。io
<?php namespace foo; use \A\B\TestA; #导入命名空间 use \A\B\TestB as TB; #导入命名空间,并别名为TB ?>
namespace
和__NAMESPACE__
魔术常量namespace
用于定义命名空间,__NAMESPACE__
是包含当前命名空间的字符串,在全局的状况下,它是一个空字符串''
。function