PHP中的命名空間相關(guān)概念淺析
1. PHP中的命名空間是什么?
什么是命名空間?“從廣義上來(lái)說(shuō),命名空間是一種封裝事物的方法。在很多地方都可以見(jiàn)到這種抽象概念。例如,在操作系統(tǒng)中目錄用來(lái)將相關(guān)文件分組,對(duì)于目錄中的文件來(lái)說(shuō),它就扮演了命名空間的角色。具體舉個(gè)例子,文件 foo.txt 可以同時(shí)在目錄/home/greg 和 /home/other 中存在,但在同一個(gè)目錄中不能存在兩個(gè) foo.txt 文件。另外,在目錄 /home/greg 外訪(fǎng)問(wèn) foo.txt 文件時(shí),我們必須將目錄名以及目錄分隔符放在文件名之前得到 /home/greg/foo.txt。這個(gè)原理應(yīng)用到程序設(shè)計(jì)領(lǐng)域就是命名空間的概念?!薄臻g概述
2. PHP命名空間該如何理解?
從本質(zhì)上講,命名空間就是一個(gè)容器,這個(gè)容器內(nèi)我們可以放入類(lèi)、函數(shù)和變量,他們?cè)谕幻臻g內(nèi)可以無(wú)條件相互訪(fǎng)問(wèn)。在命名空間之外,就必須引用或者導(dǎo)入其他命名空間,才能調(diào)用它們包含的這些項(xiàng)。
命名空間跟shell中的文件目錄的概念是一樣一樣的。在當(dāng)前目錄下可以直接用文件名訪(fǎng)問(wèn)所有文件,如果需要訪(fǎng)問(wèn)其他目錄下的文件,就需要輸入相對(duì)路徑或絕對(duì)路徑。
引用方式:
namespace foo;
class Foo {
public function foo()
{
return \top\namespace\bar\Bar::fuck();
}
}
導(dǎo)入方式:
namespace foo;
use top\namespace\bar\Bar;
class Foo {
public function foo()
{ return Bar::fuck();
}
}
導(dǎo)入就相當(dāng)于將目的類(lèi)復(fù)制一份到當(dāng)前命名空間中。
3. PHP命名空間有何實(shí)際應(yīng)用?
命名空間的存在是為了解決下面兩個(gè)問(wèn)題:
1). 用戶(hù)編寫(xiě)的代碼與PHP內(nèi)部的類(lèi)/函數(shù)/常量或第三方類(lèi)/函數(shù)/常量之間的名字沖突。
2). 為很長(zhǎng)的標(biāo)識(shí)符名稱(chēng)(通常是為了緩解第一類(lèi)問(wèn)題而定義的)創(chuàng)建一個(gè)別名(或簡(jiǎn)短)的名稱(chēng),提高源代碼的可讀性。
4. 一些tips
1. 同一個(gè)空間下的類(lèi)直接相互直接調(diào)用,屬于一家。例如 Laravel 中的 PageController 類(lèi)中可以直接寫(xiě) Page::all() 這樣的代碼來(lái)調(diào)用 Page 這個(gè)model,因?yàn)樗麄儌z都在頂級(jí)命名空間下。
2. 若一個(gè)類(lèi)存在于非頂級(jí)命名空間中,那么它只能在調(diào)用同樣是當(dāng)前命名空間下的其他類(lèi)才不用“引用”或“導(dǎo)入”,它們屬于一家。任何子命名空間都是另一個(gè)命名空間,另一個(gè)容器,沒(méi)有除了容器之間關(guān)系之外的任何特殊關(guān)系。
3. Laravel 采用 classmap 方式進(jìn)行自動(dòng)加載(autoload),PHP雖然有了命名空間這個(gè)高級(jí)特性,但是這只是邏輯關(guān)系,require 文件還是要有的。這個(gè)類(lèi)和文件的對(duì)應(yīng)關(guān)系就存在 /vendor/composer/autoload_classmap.php ,每次 composer dump-autoload 都會(huì)重新編譯、生成。
相關(guān)文章
PHP針對(duì)字符串開(kāi)頭和結(jié)尾的判斷方法
這篇文章主要介紹了PHP針對(duì)字符串開(kāi)頭和結(jié)尾的判斷方法,涉及php字符串操作的判斷、截取、判斷、比較等函數(shù)用法與注意事項(xiàng),需要的朋友可以參考下2016-07-07
PHP print類(lèi)函數(shù)使用總結(jié)
PHP print類(lèi)函數(shù)總結(jié),讓你徹底了解print函數(shù)的具體用法與使用范圍。2010-06-06
利用客戶(hù)端緩存對(duì)網(wǎng)站進(jìn)行優(yōu)化的原理分析
你的網(wǎng)站在并發(fā)訪(fǎng)問(wèn)很大并且無(wú)法承受壓力的情況下,你會(huì)選擇如何優(yōu)化?2008-09-09
require(),include(),require_once()和include_once()區(qū)別
面試中最容易提到的一個(gè)PHP的問(wèn)題,我想和大家共勉一下: require()和include()有許多相似之處,也有些不同。理解它們的不同點(diǎn)非常重要,否則很容易犯錯(cuò)誤。2008-03-03
PHP中大于2038年時(shí)間戳的問(wèn)題處理方案
這篇文章主要介紹了PHP中大于2038年時(shí)間戳的問(wèn)題處理方案,需要的朋友可以參考下2015-03-03
PHP數(shù)組相加操作及與array_merge的區(qū)別淺析
這篇文章主要給大家介紹了關(guān)于PHP數(shù)組相加操作以及與array_merge的區(qū)別,文中通過(guò)示例介紹的很詳細(xì),感興趣的朋友們可以參考學(xué)習(xí),有需要的下面跟著小編一起來(lái)學(xué)習(xí)學(xué)習(xí)吧。2016-11-11

