PHP 命名空間原理與用法詳解
本文實(shí)例講述了PHP 命名空間原理與用法。分享給大家供大家參考,具體如下:
命名空間適用于 (PHP 5 >= 5.3.0, PHP 7)
使用命名空間基礎(chǔ)PHP 命名空間類似于文件系統(tǒng),
在文件系統(tǒng)中訪問(wèn)一個(gè)文件有三種方式: 相對(duì)文件名形式如foo.txt。它會(huì)被解析為 currentdirectory/foo.txt,其中 currentdirectory 表示當(dāng)前目錄。因此如果當(dāng)前目錄是 /home/foo,則該文件名被解析為/home/foo/foo.txt。 相對(duì)路徑名形式如subdirectory/foo.txt。它會(huì)被解析為 currentdirectory/subdirectory/foo.txt。 絕對(duì)路徑名形式如/main/foo.txt。它會(huì)被解析為/main/foo.txt。PHP 命名空間中的元素使用同樣的原理。例如,類名可以通過(guò)三種方式引用: 非限定名稱,或不包含前綴的類名稱,例如 $a=new foo(); 或 foo::staticmethod();。如果當(dāng)前命名空間是 currentnamespace,foo 將被解析為currentnamespacefoo。如果使用 foo 的代碼是全局的,不包含在任何命名空間中的代碼,則 foo 會(huì)被解析為foo。 警告:如果命名空間中的函數(shù)或常量未定義,則該非限定的函數(shù)名稱或常量名稱會(huì)被解析為全局函數(shù)名稱或常量名稱。 限定名稱,或包含前綴的名稱,例如 $a = new subnamespacefoo(); 或 subnamespacefoo::staticmethod();。如果當(dāng)前的命名空間是currentnamespace,則 foo 會(huì)被解析為 currentnamespacesubnamespacefoo。如果使用 foo 的代碼是全局的,不包含在任何命名空間中的代碼,foo 會(huì)被解析為subnamespacefoo。 完全限定名稱,或包含了全局前綴操作符的名稱,例如, $a = new currentnamespacefoo(); 或 currentnamespacefoo::staticmethod();。在這種情況下,foo 總是被解析為代碼中的文字名(literal name)currentnamespacefoo。定義命名空間雖然任意合法的PHP代碼都可以包含在命名空間中,但只有以下類型的代碼受命名空間的影響,
它們是:
類(包括抽象類和traits) 接口 函數(shù) 常量命名空間通過(guò)關(guān)鍵字 namespace 來(lái)聲明。如果一個(gè)文件中包含命名空間,它必須在其它所有代碼之前聲明命名空間,除了一個(gè)以外:declare關(guān)鍵字。
<html><?phpnamespace MyProject; // 致命錯(cuò)誤 - 命名空間必須是程序腳本的第一條語(yǔ)句?>
Example 聲明單個(gè)命名空間
<?phpnamespace MyProject;const CONNECT_OK = 1;class Connection { /* ... */ }function connect() { /* ... */ }?>在同一個(gè)文件中定義多個(gè)命名空間
定義多個(gè)命名空間,推薦用大括號(hào)語(yǔ)法
<?phpnamespace MyProject {const CONNECT_OK = 1;class Connection { /* ... */ }function connect() { /* ... */ }}namespace AnotherProject {const CONNECT_OK = 1;class Connection { /* ... */ }function connect() { /* ... */ }}?>
在實(shí)際的編程實(shí)踐中,非常不提倡在同一個(gè)文件中定義多個(gè)命名空間。這種方式的主要用于將多個(gè) PHP 腳本合并在同一個(gè)文件中。
將全局的非命名空間中的代碼與命名空間中的代碼組合在一起,只能使用大括號(hào)形式的語(yǔ)法。全局代碼必須用一個(gè)不帶名稱的 namespace 語(yǔ)句加上大括號(hào)括起來(lái),例如:
<?phpdeclare(encoding=’UTF-8’);namespace MyProject {const CONNECT_OK = 1;class Connection { /* ... */ }function connect() { /* ... */ }}namespace { // 全局代碼session_start();$a = MyProjectconnect();echo MyProjectConnection::start();}?>namespace關(guān)鍵字和__NAMESPACE__常量
常量__NAMESPACE__的值是包含當(dāng)前命名空間名稱的字符串。
如果不包括在任何命名空間中的代碼,則為一個(gè)空的字符串。
<?phpnamespace MyProject;echo ’'’, __NAMESPACE__, ’'’; // 輸出 'MyProject'?><?phpecho ’'’, __NAMESPACE__, ’'’; // 輸出 ''?>
關(guān)鍵字 namespace 可用來(lái)顯式訪問(wèn)當(dāng)前命名空間或子命名空間中的元素。它等價(jià)于類中的 self 操作符。
<?phpnamespace MyProject;use blahblah as mine; // see 'Using namespaces: importing/aliasing'blahmine(); // calls function MyProjectblahmine()namespaceblahmine(); // calls function MyProjectblahmine()namespacefunc(); // calls function MyProjectfunc()namespacesubfunc(); // calls function MyProjectsubfunc()namespacecname::method(); // calls static method 'method' of class MyProjectcname$a = new namespacesubcname(); // instantiates object of class MyProjectsubcname$b = namespaceCONSTANT; // assigns value of constant MyProjectCONSTANT to $b?>使用命名空間:別名/導(dǎo)入
允許通過(guò)別名引用或?qū)胪獠康耐耆薅Q,是命名空間的一個(gè)重要特征。這有點(diǎn)類似于在類 unix 文件系統(tǒng)中可以創(chuàng)建對(duì)其它的文件或目錄的符號(hào)連接。
在PHP中,別名是通過(guò)操作符 use 來(lái)實(shí)現(xiàn)的.
<?phpuse MyFullClassname as Another, MyFullNSname;$obj = new Another; // 實(shí)例化 MyFullClassname 對(duì)象NSnamesubnsfunc(); // 調(diào)用函數(shù) MyFullNSnamesubnsfunc?>全局空間
如果沒(méi)有定義任何命名空間,所有的類與函數(shù)的定義都是在全局空間,與 PHP 引入命名空間概念前一樣。在名稱前加上前綴 表示該名稱是全局空間中的名稱,即使該名稱位于其它的命名空間中時(shí)也是如此。
<?phpnamespace ABC;/* 這個(gè)函數(shù)是 ABCfopen */function fopen() { /* ... */ $f = fopen(...); // 調(diào)用全局的fopen函數(shù) return $f;} ?>使用命名空間:后備全局函數(shù)/常量
在一個(gè)命名空間中,當(dāng) PHP 遇到一個(gè)非限定的類、函數(shù)或常量名稱時(shí),它使用不同的優(yōu)先策略來(lái)解析該名稱。
類名稱總是解析到當(dāng)前命名空間中的名稱。因此在訪問(wèn)系統(tǒng)內(nèi)部或不包含在命名空間中的類名稱時(shí),必須使用完全限定名稱,
<?phpnamespace ABC;class Exception extends Exception {}$a = new Exception(’hi’); // $a 是類 ABCException 的一個(gè)對(duì)象$b = new Exception(’hi’); // $b 是類 Exception 的一個(gè)對(duì)象$c = new ArrayObject; // 致命錯(cuò)誤, 找不到 ABCArrayObject 類?>
對(duì)于函數(shù)和常量來(lái)說(shuō),如果當(dāng)前命名空間中不存在該函數(shù)或常量,PHP 會(huì)退而使用全局空間中的函數(shù)或常量。
<?phpnamespace ABC;const E_ERROR = 45;function strlen($str){ return strlen($str) - 1;}echo E_ERROR, 'n'; // 輸出 '45'echo INI_ALL, 'n'; // 輸出 '7' - 使用全局常量 INI_ALLecho strlen(’hi’), 'n'; // 輸出 '1'if (is_array(’hi’)) { // 輸出 'is not array' echo 'is arrayn';} else { echo 'is not arrayn';}?>
PHP 官方文檔:
http://php.net/manual/zh/language.namespaces.php
更多關(guān)于PHP相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《php面向?qū)ο蟪绦蛟O(shè)計(jì)入門(mén)教程》、《PHP數(shù)組(Array)操作技巧大全》、《PHP基本語(yǔ)法入門(mén)教程》、《PHP運(yùn)算與運(yùn)算符用法總結(jié)》、《php字符串(string)用法總結(jié)》、《php+mysql數(shù)據(jù)庫(kù)操作入門(mén)教程》及《php常見(jiàn)數(shù)據(jù)庫(kù)操作技巧匯總》
希望本文所述對(duì)大家PHP程序設(shè)計(jì)有所幫助。
相關(guān)文章:
1. SpringBoot項(xiàng)目?jī)?yōu)雅的全局異常處理方式(全網(wǎng)最新)2. 簡(jiǎn)述JAVA同步、異步、阻塞和非阻塞之間的區(qū)別3. 解決python路徑錯(cuò)誤,運(yùn)行.py文件,找不到路徑的問(wèn)題4. Python TestSuite生成測(cè)試報(bào)告過(guò)程解析5. python操作數(shù)據(jù)庫(kù)獲取結(jié)果之fetchone和fetchall的區(qū)別說(shuō)明6. IntelliJ IDEA設(shè)置默認(rèn)瀏覽器的方法7. docker /var/lib/docker/aufs/mnt 目錄清理方法8. IntelliJ IDEA設(shè)置背景圖片的方法步驟9. 在JSP中使用formatNumber控制要顯示的小數(shù)位數(shù)方法10. 如何清空python的變量
