您好,登錄后才能下訂單哦!
從廣義上來說,命名空間是一種封裝事物的方法。在很多地方都可以見到這種抽象概念。例如,在操作系統(tǒng)中目錄用來將相關(guān)文件分組,對(duì)于目錄中的文件來說,它就扮演了命名空間的角色。這個(gè)原理應(yīng)用到程序設(shè)計(jì)領(lǐng)域就是命名空間的概念
在PHP中,命名空間用來解決在編寫類庫或應(yīng)用程序時(shí)創(chuàng)建可重用的代碼如類或函數(shù)時(shí)碰到的兩類問題:一類是用戶編寫的代碼與PHP內(nèi)部的類/函數(shù)/常量或第三方類/函數(shù)/常量之間的名字沖突;另一類是為很長的標(biāo)識(shí)符名稱(通常是為了緩解第一類問題而定義的)創(chuàng)建一個(gè)別名(或簡(jiǎn)短)的名稱,提高源代碼的可讀性。PHP命名空間提供了一種將相關(guān)的類、函數(shù)和常量組合到一起的途徑。本文將詳細(xì)介紹PHP的命名空間
雖然任意合法的PHP代碼都可以包含在命名空間中,但只有以下類型的代碼受命名空間的影響,它們是:類(包括抽象類和traits)、接口、函數(shù)和常量
命名空間通過關(guān)鍵字namespace來聲明。如果一個(gè)文件中包含命名空間,它必須在其它所有代碼之前聲明命名空間,除了一個(gè)以外:declare關(guān)鍵字
<?php namespace MyProject;const CONNECT_OK = 1;class Connection { /* ... */ }function connect() { /* ... */ }?>
子命名空間
與目錄和文件的關(guān)系很象,PHP 命名空間也允許指定層次化的命名空間的名稱。因此,命名空間的名字可以使用分層次的方式定義
<?php namespace MyProject\Sub\Level;const CONNECT_OK = 1;class Connection { /* ... */ }function connect() { /* ... */ }?>
<?php namespace MyProject\Sub\Level; const NUM = 1; echo NUM;//1 echo \MyProject\Sub\Level\NUM;//1?>
可以在同一個(gè)文件中定義多個(gè)命名空間。在同一個(gè)文件中定義多個(gè)命名空間有兩種語法形式
在實(shí)際的編程實(shí)踐中,非常不提倡在同一個(gè)文件中定義多個(gè)命名空間。這種方式的主要用于將多個(gè) PHP 腳本合并在同一個(gè)文件中
【1】簡(jiǎn)單組合語法(不建議使用)
<?php namespace MyProject;const CONNECT_OK = 1;class Connection { /* ... */ }function connect() { /* ... */ } namespace AnotherProject;const CONNECT_OK = 1;class Connection { /* ... */ }function connect() { /* ... */ }?>
【2】大括號(hào)語法
<?php namespace MyProject {const CONNECT_OK = 1;class Connection { /* ... */ }function connect() { /* ... */ } } namespace AnotherProject {const CONNECT_OK = 1;class Connection { /* ... */ }function connect() { /* ... */ } }?>
<?php namespace MyProject { const NUM = 1; } namespace AnotherProject { const NUM = 2; echo NUM;//2 echo \MyProject\NUM;//1}?>
全局
將全局的非命名空間中的代碼與命名空間中的代碼組合在一起,只能使用大括號(hào)形式的語法。全局代碼必須用一個(gè)不帶名稱的 namespace 語句加上大括號(hào)括起來
<?php namespace MyProject {const CONNECT_OK = 1;class Connection { /* ... */ }function connect() { /* ... */ } } namespace { // global codesession_start();$a = MyProject\connect();echo MyProject\Connection::start(); }?>
非限定名稱Unqualified name是指名稱中不包含命名空間分隔符的標(biāo)識(shí)符,例如 Foo
限定名稱Qualified name是指名稱中含有命名空間分隔符的標(biāo)識(shí)符,例如 Foo\Bar
完全限定名稱Fully qualified name是指名稱中包含命名空間分隔符,并以命名空間分隔符開始的標(biāo)識(shí)符,例如 \Foo\Bar。 namespace\Foo 也是一個(gè)完全限定名稱
如果要?jiǎng)討B(tài)訪問元素(例如,變量函數(shù)),必須使用完全限定名稱
<?php namespace MyProject; function test(){ echo '111'; } $var1 = 'test'; $var2 = '\MyProject\test'; $var1();//報(bào)錯(cuò) $var2();/111 ?>
PHP支持兩種抽象的訪問當(dāng)前命名空間內(nèi)部元素的方法,__NAMESPACE__ 魔術(shù)常量和namespace關(guān)鍵字
常量__NAMESPACE__的值是包含當(dāng)前命名空間名稱的字符串。在全局的,不包括在任何命名空間中的代碼,它包含一個(gè)空的字符串
<?php namespace MyProject; function test(){ echo '111'; } $var = __NAMESPACE__.'\test'; $var();//111?>
關(guān)鍵字 namespace 可用來顯式訪問當(dāng)前命名空間或子命名空間中的元素。它等價(jià)于類中的 self 操作符
<?php namespace MyProject; function test(){ echo '111'; } test();//111 __NAMESPACE__.test();//111 namespace\test();//111?>
如果沒有定義任何命名空間,所有的類與函數(shù)的定義都是在全局空間,與 PHP 引入命名空間概念前一樣。在名稱前加上前綴 \ 表示該名稱是全局空間中的名稱,即使該名稱位于其它的命名空間中時(shí)也是如此
<?php namespace A\B\C;/* 這個(gè)函數(shù)是 A\B\C\fopen */function fopen() { /* ... */ $f = \fopen(...); // 調(diào)用全局的fopen函數(shù) return $f; } ?>
php允許通過別名引用或?qū)胪獠康耐耆薅Q,是命名空間的一個(gè)重要特征。這有點(diǎn)類似于在類unix文件系統(tǒng)中可以創(chuàng)建對(duì)其它的文件或目錄的符號(hào)連接
所有支持命名空間的PHP版本支持三種別名或?qū)敕绞剑簽轭惷Q使用別名、為接口使用別名或?yàn)槊臻g名稱使用別名
在PHP中,別名是通過操作符 use 來實(shí)現(xiàn)的
別名
<?php namespace hello\world\test;use hello\world\test as t;//用t來替代hello\world\testfunction demo(){ echo '111'; } t\demo();//111?>
as可以省略
<?php namespace hello\world\test;use hello\world\test;//用test來替代hello\world\testfunction demo(){ echo '111'; } test\demo();//111?>
導(dǎo)入
<?phpuse \ArrayObject;$a = new ArrayObject([]);//若不使用"use \ArrayObject" ,則實(shí)例化一個(gè) foo\ArrayObject 對(duì)象?>
為了簡(jiǎn)化,一行中可以包含多個(gè)use語句
<?phpuse My\Full\Classname as Another, My\Full\NSname;$obj = new Another; // 實(shí)例化 My\Full\Classname 對(duì)象NSname\subns\func(); // 調(diào)用函數(shù) My\Full\NSname\subns\func?>
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。