欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

PHP中命名空間是什么

PHP中命名空間是什么,相信很多沒有經(jīng)驗(yàn)的人對此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個(gè)問題。

公司主營業(yè)務(wù):成都網(wǎng)站制作、成都做網(wǎng)站、外貿(mào)營銷網(wǎng)站建設(shè)、移動(dòng)網(wǎng)站開發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實(shí)現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競爭能力。創(chuàng)新互聯(lián)建站是一支青春激揚(yáng)、勤奮敬業(yè)、活力青春激揚(yáng)、勤奮敬業(yè)、活力澎湃、和諧高效的團(tuán)隊(duì)。公司秉承以“開放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對我們的高要求,感謝他們從不同領(lǐng)域給我們帶來的挑戰(zhàn),讓我們激情的團(tuán)隊(duì)有機(jī)會(huì)用頭腦與智慧不斷的給客戶帶來驚喜。創(chuàng)新互聯(lián)建站推出孝義免費(fèi)做網(wǎng)站回饋大家。

PHP中命名空間是怎樣的存在

全局空間

當(dāng)文件中定義了命名空間,也就是namesapce指定了當(dāng)前的命名空間后,在調(diào)用全局類、函數(shù)、常量時(shí),需要添加一個(gè)“\”,也就是完全限定訪問符號(hào)來標(biāo)明這個(gè)類、函數(shù)、常量是全局的那個(gè),而不是當(dāng)前命名空間中的。特別是當(dāng)前命名空間中包含與全局類、函數(shù)、常量同名的內(nèi)容時(shí)。

namespace FILE6;

function show()
{
    echo strtoupper('aaa'), PHP_EOL; // 調(diào)用自己的
    echo \strtoupper('aaa'), PHP_EOL; // 調(diào)用全局的
}

function strtoupper($str)
{
    return __NAMESPACE__ . ':' . \strtoupper($str);
}

 

在這個(gè)FILE6命名空間中,我們定義了一個(gè)strtoupper()方法。之間說過,命名空間就是為了解決同名問題而出現(xiàn)的,這個(gè)方法和全局php自帶的那個(gè)方法是完全相同的名稱的。所以,在調(diào)用的時(shí)候我們需要調(diào)用的是哪個(gè)方法。那么如果當(dāng)前命名空間中沒有定義這個(gè)方法呢?別急,接下來的內(nèi)容就是講這個(gè)問題。

 

后備全局函數(shù)/常量

從上個(gè)例子中,我們就可以看出全局完全限定訪問符的作用,當(dāng)沒有使用全局符時(shí),strtoupper()方法會(huì)先調(diào)用當(dāng)前命名空間下的方法。那么后備的作用就是如果當(dāng)前命名空間中沒有找到時(shí),會(huì)去全局找相關(guān)的函數(shù)。在文檔中的定義是這樣的:

當(dāng) PHP 遇到一個(gè)非限定的類、函數(shù)或常量名稱時(shí),它使用不同的優(yōu)先策略來解析該名稱。類名稱總是解析到當(dāng)前命名空間中的名稱。因此在訪問系統(tǒng)內(nèi)部或不包含在命名空間中的類名稱時(shí),必須使用完全限定名稱。對于函數(shù)和常量來說,如果當(dāng)前命名空間中不存在該函數(shù)或常量,PHP 會(huì)退而使用全局空間中的函數(shù)或常量。

意思也就是說,函數(shù)和常量,會(huì)有后備去全局查找的能力。但是類不行!!如果要使用全局類,一定要加全局完全限定符。我們通過一個(gè)例子來看:

namespace FILE7;

// 類必須使用完全限定的全局空間
$o1 = new \stdClass();
// $o2 = new stdClass(); // Fatal error: Uncaught Error: Class 'FILE7\stdClass' not found

// 方法會(huì)先在本命名空間查找,如果沒找到會(huì)去全局找
function strlen($str)
{
    return __NAMESPACE__ . ':' . (\strlen($str) - 1);
}
echo strlen('abc'), PHP_EOL; // FILE7:2 ,當(dāng)前命名空間
echo \strlen('abc'), PHP_EOL; // 3 , 全局

echo strtoupper('abc'), PHP_EOL; // ABC, 全局

// 常量也是有后備能力的

const E_ERROR = 22; 
echo E_ERROR, PHP_EOL; // 22, 當(dāng)前命名空間
echo \E_ERROR, PHP_EOL; // 1, 全局

echo INI_ALL, PHP_EOL; // 7, 全局
   

名稱解析規(guī)則

  1. 對完全限定名稱的函數(shù),類和常量的調(diào)用在編譯時(shí)解析。例如 new \A\B 解析為類 A\B。
  2. 所有的非限定名稱和限定名稱(非完全限定名稱)根據(jù)當(dāng)前的導(dǎo)入規(guī)則在編譯時(shí)進(jìn)行轉(zhuǎn)換。例如,如果命名空間 A\B\C 被導(dǎo)入為 C,那么對 C\D\e() 的調(diào)用就會(huì)被轉(zhuǎn)換為 A\B\C\D\e()。
  3. 在命名空間內(nèi)部,所有的沒有根據(jù)導(dǎo)入規(guī)則轉(zhuǎn)換的限定名稱均會(huì)在其前面加上當(dāng)前的命名空間名稱。例如,在命名空間 A\B 內(nèi)部調(diào)用 C\D\e(),則 C\D\e() 會(huì)被轉(zhuǎn)換為 A\B\C\D\e() 。
  4. 非限定類名根據(jù)當(dāng)前的導(dǎo)入規(guī)則在編譯時(shí)轉(zhuǎn)換(用全名代替短的導(dǎo)入名稱)。例如,如果命名空間 A\B\C 導(dǎo)入為C,則 new C() 被轉(zhuǎn)換為 new A\B\C() 。
  5. 在命名空間內(nèi)部(例如A\B),對非限定名稱的函數(shù)調(diào)用是在運(yùn)行時(shí)解析的。例如對函數(shù) foo() 的調(diào)用是這樣解析的:
    • 在當(dāng)前命名空間中查找名為 A\B\foo() 的函數(shù)
    • 嘗試查找并調(diào)用 全局(global) 空間中的函數(shù) foo()。
  6. 在命名空間(例如A\B)內(nèi)部對非限定名稱或限定名稱類(非完全限定名稱)的調(diào)用是在運(yùn)行時(shí)解析的。下面是調(diào)用 new C() 及 new D\E() 的解析過程:new C()的解析:
    • 在當(dāng)前命名空間中查找A\B\C類。
    • 嘗試自動(dòng)裝載類A\B\C。

new D\E()的解析:

  1. 在類名稱前面加上當(dāng)前命名空間名稱變成:A\B\D\E,然后查找該類。
  2. 嘗試自動(dòng)裝載類 A\B\D\E。

為了引用全局命名空間中的全局類,必須使用完全限定名稱 new \C()。

看完上述內(nèi)容,你們掌握PHP中命名空間是什么的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!

本文題目:PHP中命名空間是什么
當(dāng)前路徑:http://chinadenli.net/article12/goipdc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供云服務(wù)器網(wǎng)站營銷網(wǎng)站建設(shè)移動(dòng)網(wǎng)站建設(shè)App開發(fā)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

小程序開發(fā)