PHP基礎(chǔ)之命名空間9——名稱解析規(guī)則
在說明名稱解析規(guī)則之前,我們先看一些重要的定義:
命名空間名稱定義
非限定名稱名稱中不包含命名空間分隔符的標(biāo)識(shí)符,例如?Foo限定名稱名稱中含有命名空間分隔符的標(biāo)識(shí)符,例如?FooBar完全限定名稱名稱中包含命名空間分隔符,并以命名空間分隔符開始的標(biāo)識(shí)符,例如?FooBar。?namespaceFoo?也是一個(gè)完全限定名稱。名稱解析遵循下列規(guī)則:
對(duì)完全限定名稱的函數(shù),類和常量的調(diào)用在編譯時(shí)解析。例如?new AB?解析為類?AB。所有的非限定名稱和限定名稱(非完全限定名稱)根據(jù)當(dāng)前的導(dǎo)入規(guī)則在編譯時(shí)進(jìn)行轉(zhuǎn)換。例如,如果命名空間?ABC?被導(dǎo)入為?C,那么對(duì)?CDe()?的調(diào)用就會(huì)被轉(zhuǎn)換為?ABCDe()。在命名空間內(nèi)部,所有的沒有根據(jù)導(dǎo)入規(guī)則轉(zhuǎn)換的限定名稱均會(huì)在其前面加上當(dāng)前的命名空間名稱。例如,在命名空間?AB?內(nèi)部調(diào)用?CDe(),則?CDe()?會(huì)被轉(zhuǎn)換為ABCDe()?。非限定類名根據(jù)當(dāng)前的導(dǎo)入規(guī)則在編譯時(shí)轉(zhuǎn)換(用全名代替短的導(dǎo)入名稱)。例如,如果命名空間?ABC?導(dǎo)入為C,則?new C()?被轉(zhuǎn)換為?new ABC()?。在命名空間內(nèi)部(例如AB),對(duì)非限定名稱的函數(shù)調(diào)用是在運(yùn)行時(shí)解析的。例如對(duì)函數(shù)?foo()?的調(diào)用是這樣解析的:在當(dāng)前命名空間中查找名為?ABfoo()?的函數(shù)嘗試查找并調(diào)用?全局(global)?空間中的函數(shù)?foo()。在命名空間(例如AB)內(nèi)部對(duì)非限定名稱或限定名稱類(非完全限定名稱)的調(diào)用是在運(yùn)行時(shí)解析的。下面是調(diào)用?new C()?及?new DE()?的解析過程:?new C()的解析:在當(dāng)前命名空間中查找ABC類。嘗試自動(dòng)裝載類ABC。new DE()的解析:
在類名稱前面加上當(dāng)前命名空間名稱變成:ABDE,然后查找該類。嘗試自動(dòng)裝載類?ABDE。為了引用全局命名空間中的全局類,必須使用完全限定名稱?new C()。
Example #1 名稱解析示例
<?php namespace A; use BD, CE as F; // 函數(shù)調(diào)用 foo(); // 首先嘗試調(diào)用定義在命名空間'A'中的函數(shù)foo() // 再嘗試調(diào)用全局函數(shù) 'foo' foo(); // 調(diào)用全局空間函數(shù) 'foo' myfoo(); // 調(diào)用定義在命名空間'Amy'中函數(shù) 'foo' F(); // 首先嘗試調(diào)用定義在命名空間'A'中的函數(shù) 'F' // 再嘗試調(diào)用全局函數(shù) 'F' // 類引用 new B(); // 創(chuàng)建命名空間 'A' 中定義的類 'B' 的一個(gè)對(duì)象 // 如果未找到,則嘗試自動(dòng)裝載類 'AB' new D(); // 使用導(dǎo)入規(guī)則,創(chuàng)建命名空間 'B' 中定義的類 'D' 的一個(gè)對(duì)象 // 如果未找到,則嘗試自動(dòng)裝載類 'BD' new E(); // 使用導(dǎo)入規(guī)則,創(chuàng)建命名空間 'C' 中定義的類 'E' 的一個(gè)對(duì)象 // 如果未找到,則嘗試自動(dòng)裝載類 'CE'new B(); // 創(chuàng)建定義在全局空間中的類 'B' 的一個(gè)對(duì)象 // 如果未發(fā)現(xiàn),則嘗試自動(dòng)裝載類 'B'new D(); // 創(chuàng)建定義在全局空間中的類 'D' 的一個(gè)對(duì)象 // 如果未發(fā)現(xiàn),則嘗試自動(dòng)裝載類 'D'new F(); // 創(chuàng)建定義在全局空間中的類 'F' 的一個(gè)對(duì)象 // 如果未發(fā)現(xiàn),則嘗試自動(dòng)裝載類 'F'// 調(diào)用另一個(gè)命名空間中的靜態(tài)方法或命名空間函數(shù) Bfoo(); // 調(diào)用命名空間 'AB' 中函數(shù) 'foo' B::foo(); // 調(diào)用命名空間 'A' 中定義的類 'B' 的 'foo' 方法 // 如果未找到類 'AB' ,則嘗試自動(dòng)裝載類 'AB' D::foo(); // 使用導(dǎo)入規(guī)則,調(diào)用命名空間 'B' 中定義的類 'D' 的 'foo' 方法 // 如果類 'BD' 未找到,則嘗試自動(dòng)裝載類 'BD'Bfoo(); // 調(diào)用命名空間 'B' 中的函數(shù) 'foo' B::foo(); // 調(diào)用全局空間中的類 'B' 的 'foo' 方法 // 如果類 'B' 未找到,則嘗試自動(dòng)裝載類 'B'// 當(dāng)前命名空間中的靜態(tài)方法或函數(shù) AB::foo(); // 調(diào)用命名空間 'AA' 中定義的類 'B' 的 'foo' 方法 // 如果類 'AAB' 未找到,則嘗試自動(dòng)裝載類 'AAB'AB::foo(); // 調(diào)用命名空間 'AB' 中定義的類 'B' 的 'foo' 方法 // 如果類 'AB' 未找到,則嘗試自動(dòng)裝載類 'AB'?>
相關(guān)文章:
