以前沒有系統學習過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