真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

PHP中命名空間是什么

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

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

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

全局空間

當(dāng)文件中定義了命名空間,也就是namesapce指定了當(dāng)前的命名空間后,在調(diào)用全局類、函數(shù)、常量時(shí),需要添加一個(gè)“\”,也就是完全限定訪問(wèn)符號(hào)來(lái)標(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()方法。之間說(shuō)過(guò),命名空間就是為了解決同名問(wèn)題而出現(xiàn)的,這個(gè)方法和全局php自帶的那個(gè)方法是完全相同的名稱的。所以,在調(diào)用的時(shí)候我們需要調(diào)用的是哪個(gè)方法。那么如果當(dāng)前命名空間中沒(méi)有定義這個(gè)方法呢?別急,接下來(lái)的內(nèi)容就是講這個(gè)問(wèn)題。

 

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

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

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

意思也就是說(shuō),函數(shù)和常量,會(huì)有后備去全局查找的能力。但是類不行?。∪绻褂萌诸?,一定要加全局完全限定符。我們通過(guò)一個(gè)例子來(lái)看:

namespace FILE7;

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

// 方法會(huì)先在本命名空間查找,如果沒(méi)找到會(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. 對(duì)完全限定名稱的函數(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,那么對(duì) C\D\e() 的調(diào)用就會(huì)被轉(zhuǎn)換為 A\B\C\D\e()。
  3. 在命名空間內(nèi)部,所有的沒(mé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),對(duì)非限定名稱的函數(shù)調(diào)用是在運(yùn)行時(shí)解析的。例如對(duì)函數(shù) foo() 的調(diào)用是這樣解析的:
    • 在當(dāng)前命名空間中查找名為 A\B\foo() 的函數(shù)
    • 嘗試查找并調(diào)用 全局(global) 空間中的函數(shù) foo()。
  6. 在命名空間(例如A\B)內(nèi)部對(duì)非限定名稱或限定名稱類(非完全限定名稱)的調(diào)用是在運(yùn)行時(shí)解析的。下面是調(diào)用 new C() 及 new D\E() 的解析過(guò)程: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中命名空間是什么
分享鏈接:http://weahome.cn/article/goipdc.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部