使用命名空間:基礎(chǔ)

http://php.net/manual/zh/language.namespaces.basics.php#language.namespaces.basics

(PHP 5 >= 5.3.0, PHP 7)
在討論如何使用命名空間之前,必須了解 PHP 是如何知道要使用哪一個(gè)命名空間中的元素的』盟可以將 PHP 命名空間與文件系統(tǒng)作一個(gè)簡(jiǎn)單的類比鉴未。在文件系統(tǒng)中訪問一個(gè)文件有三種方式:

  1. 相對(duì)文件名形式如foo.txt疫衩。它會(huì)被解析為 currentdirectory/foo.txt邑商,其中 currentdirectory 表示當(dāng)前目錄删掀。因此如果當(dāng)前目錄是 /home/foo殃姓,則該文件名被解析為/home/foo/foo.txt袁波。
  2. 相對(duì)路徑名形式如subdirectory/foo.txt。它會(huì)被解析為 currentdirectory/subdirectory/foo.txt蜗侈。
  3. 絕對(duì)路徑名形式如/main/foo.txt篷牌。它會(huì)被解析為/main/foo.txt

PHP 命名空間中的元素使用同樣的原理踏幻。例如枷颊,類名可以通過三種方式引用:

  1. 非限定名稱,或不包含前綴的類名稱该面,例如 $a=new foo();foo::staticmethod();夭苗。如果當(dāng)前命名空間是currentnamespace,foo 將被解析為 currentnamespace\foo隔缀。如果使用 foo 的代碼是全局的题造,不包含在任何命名空間中的代碼,則 foo 會(huì)被解析為foo猾瘸。 警告:如果命名空間中的函數(shù)或常量未定義晌梨,則該非限定的函數(shù)名稱或常量名稱會(huì)被解析為全局函數(shù)名稱或常量名稱桥嗤。詳情參見 使用命名空間:后備全局函數(shù)名稱/常量名稱
  2. 限定名稱,或包含前綴的名稱仔蝌,例如 $a = new subnamespace\foo();subnamespace\foo::staticmethod();泛领。如果當(dāng)前的命名空間是 currentnamespace,則 foo 會(huì)被解析為 currentnamespace\subnamespace\foo敛惊。如果使用 foo 的代碼是全局的渊鞋,不包含在任何命名空間中的代碼,foo 會(huì)被解析為subnamespace\foo瞧挤。
  3. 完全限定名稱锡宋,或包含了全局前綴操作符的名稱,例如特恬, $a = new \currentnamespace\foo();\currentnamespace\foo::staticmethod();执俩。在這種情況下,foo 總是被解析為代碼中的文字名(literal name)currentnamespace\foo癌刽。

下面是一個(gè)使用這三種方式的實(shí)例:

file1.php
<?php
  namespace Foo\Bar\subnamespace;
  const FOO = 1;
  function foo() {}
  class foo{
    static function staticmethod() {}
  }
?>

file2.php
<?php
  namespace Foo\Bar;
  include 'file1.php';
  const FOO = 2;
  function foo() {}
  class foo{
    static function staticmethod() {}
  }

  /* 非限定名稱 */
  foo(); // 解析為 Foo\Bar\foo
  foo::staticmethod(); // 解析為類 Foo\Bar\foo的靜態(tài)方法staticmethod
  echo FOO; // resolves to constant Foo\Bar\FOO

  /* 限定名稱 */
  subnamespace\foo(); // 解析為函數(shù) Foo\Bar\subnamespace\foo
  subnamespace\foo::staticmethod(); // 解析為類 Foo\Bar\subnamespace\foo以及類的方法 staticmethod
  echo subnamespace\FOO; // 解析為常量 Foo\Bar\subnamespace\FOO                                  

  /* 完全限定名稱 */
  \Foo\Bar\foo(); // 解析為函數(shù) Foo\Bar\foo\Foo
  \Bar\foo::staticmethod(); // 解析為類 Foo\Bar\foo, 以及類的方法 staticmethod
  echo \Foo\Bar\FOO; // 解析為常量 Foo\Bar\FOO
?>

注意訪問任意全局類役首、函數(shù)或常量,都可以使用完全限定名稱显拜,例如 \strlen()\Exception\INI_ALL衡奥。
Example #1 在命名空間內(nèi)部訪問全局類、函數(shù)和常量

<?php
  namespace Foo;
  function strlen() {}
  const INI_ALL = 3;
  class Exception {}
  $a = \strlen('hi'); // 調(diào)用全局函數(shù)
  strlen$b = \INI_ALL; // 訪問全局常量 INI_ALL
  $c = new \Exception('error'); // 實(shí)例化全局類 Exception
?>

namespace關(guān)鍵字和NAMESPACE常量

PHP支持兩種抽象的訪問當(dāng)前命名空間內(nèi)部元素的方法远荠,NAMESPACE 魔術(shù)常量和namespace關(guān)鍵字矮固。
常量NAMESPACE的值是包含當(dāng)前命名空間名稱的字符串。在全局的譬淳,不包括在任何命名空間中的代碼档址,它包含一個(gè)空的字符串。
例子:

<?php
namespace MyProject;

echo '"', __NAMESPACE__, '"'; // 輸出 "MyProject"
?>

關(guān)鍵字 namespace 可用來顯式訪問當(dāng)前命名空間或子命名空間中的元素邻梆。它等價(jià)于類中的 self 操作符守伸。

<?php
namespace MyProject;

use blah\blah as mine; // see "Using namespaces: importing/aliasing"

blah\mine(); // calls function MyProject\blah\mine()
namespace\blah\mine(); // calls function MyProject\blah\mine()

namespace\func(); // calls function MyProject\func()
namespace\sub\func(); // calls function MyProject\sub\func()
namespace\cname::method(); // calls static method "method" of class MyProject\cname
$a = new namespace\sub\cname(); // instantiates object of class MyProject\sub\cname
$b = namespace\CONSTANT; // assigns value of constant MyProject\CONSTANT to $b
?>

使用命名空間:別名/導(dǎo)入

允許通過別名引用或?qū)胪獠康耐耆薅Q,是命名空間的一個(gè)重要特征确虱。這有點(diǎn)類似于在類 unix 文件系統(tǒng)中可以創(chuàng)建對(duì)其它的文件或目錄的符號(hào)連接含友。

所有支持命名空間的PHP版本支持三種別名或?qū)敕绞剑簽轭惷Q使用別名替裆、為接口使用別名或?yàn)槊臻g名稱使用別名校辩。PHP 5.6開始允許導(dǎo)入函數(shù)或常量或者為它們?cè)O(shè)置別名。

在PHP中辆童,別名是通過操作符 use 來實(shí)現(xiàn)的. 下面是一個(gè)使用所有可能的五種導(dǎo)入方式的例子:

<?php
namespace foo;
use My\Full\Classname as Another;

// 下面的例子與 use My\Full\NSname as NSname 相同
use My\Full\NSname;

// 導(dǎo)入一個(gè)全局類
use ArrayObject;

// importing a function (PHP 5.6+)
use function My\Full\functionName;

// aliasing a function (PHP 5.6+)
use function My\Full\functionName as func;

// importing a constant (PHP 5.6+)
use const My\Full\CONSTANT;

$obj = new namespace\Another; // 實(shí)例化 foo\Another 對(duì)象
$obj = new Another; // 實(shí)例化 My\Full\Classname 對(duì)象
NSname\subns\func(); // 調(diào)用函數(shù) My\Full\NSname\subns\func
$a = new ArrayObject(array(1)); // 實(shí)例化 ArrayObject 對(duì)象
// 如果不使用 "use \ArrayObject" 宜咒,則實(shí)例化一個(gè) foo\ArrayObject 對(duì)象
func(); // calls function My\Full\functionName
echo CONSTANT; // echoes the value of My\Full\CONSTANT
?>
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市把鉴,隨后出現(xiàn)的幾起案子故黑,更是在濱河造成了極大的恐慌儿咱,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,000評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件场晶,死亡現(xiàn)場(chǎng)離奇詭異混埠,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)诗轻,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,745評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門钳宪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人扳炬,你說我怎么就攤上這事吏颖。” “怎么了恨樟?”我有些...
    開封第一講書人閱讀 168,561評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵半醉,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我劝术,道長(zhǎng)缩多,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,782評(píng)論 1 298
  • 正文 為了忘掉前任夯尽,我火速辦了婚禮瞧壮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘匙握。我一直安慰自己咆槽,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,798評(píng)論 6 397
  • 文/花漫 我一把揭開白布圈纺。 她就那樣靜靜地躺著秦忿,像睡著了一般。 火紅的嫁衣襯著肌膚如雪蛾娶。 梳的紋絲不亂的頭發(fā)上灯谣,一...
    開封第一講書人閱讀 52,394評(píng)論 1 310
  • 那天,我揣著相機(jī)與錄音蛔琅,去河邊找鬼胎许。 笑死,一個(gè)胖子當(dāng)著我的面吹牛罗售,可吹牛的內(nèi)容都是我干的辜窑。 我是一名探鬼主播,決...
    沈念sama閱讀 40,952評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼寨躁,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼穆碎!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起职恳,我...
    開封第一講書人閱讀 39,852評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤所禀,失蹤者是張志新(化名)和其女友劉穎方面,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體色徘,經(jīng)...
    沈念sama閱讀 46,409評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡恭金,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,483評(píng)論 3 341
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了褂策。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蔚叨。...
    茶點(diǎn)故事閱讀 40,615評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖辙培,靈堂內(nèi)的尸體忽然破棺而出蔑水,到底是詐尸還是另有隱情,我是刑警寧澤扬蕊,帶...
    沈念sama閱讀 36,303評(píng)論 5 350
  • 正文 年R本政府宣布搀别,位于F島的核電站,受9級(jí)特大地震影響尾抑,放射性物質(zhì)發(fā)生泄漏歇父。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,979評(píng)論 3 334
  • 文/蒙蒙 一再愈、第九天 我趴在偏房一處隱蔽的房頂上張望榜苫。 院中可真熱鬧,春花似錦翎冲、人聲如沸垂睬。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,470評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽驹饺。三九已至,卻和暖如春缴渊,著一層夾襖步出監(jiān)牢的瞬間赏壹,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,571評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工衔沼, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蝌借,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,041評(píng)論 3 377
  • 正文 我出身青樓指蚁,卻偏偏與公主長(zhǎng)得像菩佑,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子欣舵,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,630評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容

  • 提出問題 解決問題--命名空間的使用 PHP的命名空間(namespace)是php5.3之后才有的擎鸠。這個(gè)概念在C...
    洞房花豬閱讀 2,845評(píng)論 0 3
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理缀磕,服務(wù)發(fā)現(xiàn)缘圈,斷路器劣光,智...
    卡卡羅2017閱讀 134,704評(píng)論 18 139
  • PHP(一)基礎(chǔ)語法 本來就是學(xué)習(xí)筆記,就不說廢話了 參考 PHP 手冊(cè)陳惠貞 , 陳俊榮.PHP 7&MySQL...
    cndaqiang閱讀 1,095評(píng)論 1 1
  • 收藏自cnblog糟把,寫的非常清晰绢涡,感謝作者‘流金歲月’http://www.cnblogs.com/kuyuecs...
    InitialX閱讀 1,202評(píng)論 0 5
  • 今天,早上遣疯,電力電子課上雄可,時(shí)間幾乎等于浪費(fèi),好像每節(jié)電力電子課都是這樣浪費(fèi)時(shí)間缠犀。不能再聽電力電子技術(shù)的課了数苫,因?yàn)槔?..
    天才寬寬閱讀 253評(píng)論 0 0