php命名空間學習詳解_php技巧

來源:互聯網
上載者:User

1、什麼是命名空間?
命名空間是一種特殊的範圍,它包含處於該範圍下的標識符,同時它本身也是一種標識符。可以把命名空間與作業系統的目錄對應起來。一個命名空間相當於一個目錄,命名空間裡的類,函數,常量,相當於目錄裡的檔案。同一個目錄(命名空間)裡的檔案名稱不能相同,但是不同的目錄裡可以有相同名字的檔案。
2、使用命名空間為瞭解決什麼問題?
解決名字衝突,比如定義了一個類,正好這個類與PHP內部的類或是include進來的一個類庫裡的類重名了。
提高代碼可讀性,命名空間有一個別名功能,它可以幫你給一個長達十幾個字元的類名起一個別名,從而縮短代碼,也不用擔心與其他空間的命名衝突。
3、哪一些代碼會受命名空間的影響。
三類:類、函數、常量。只有它們兄弟三受影響,其他的該幹嘛,還幹嘛去。說到常量,php 5.3以後可以使用const關鍵字來定義常量,5.3這前使用define,命名空間只對const關鍵字有效。
4、命名空間如何定義

複製代碼 代碼如下:

namespace MyProject;
const CONNECT_OK = 1;//php5.3以後
class Connection { /* ... */ }
function connect() { /* ... */  }
#例子二
namespace MyProjectSubLevel;
const CONNECT_OK = 1;//php5.3以後
class Connection { /* ... */ }
function connect() { /* ... */  }

使用 `namespace 空間名` 來申明一個空間,在namespace之前除了declare語句不能有任何其他php語句,同時也不能有任何非php代碼,連空格都不能有。
以下為錯誤的形式:
複製代碼 代碼如下:

$a = 1;
namespace MyProject;
?>www.jb51.net
//Fatal error: Namespace declaration statement has to be the very first statement in the script...

另外同一個命名空間是可以定義在多個檔案中,這對於組織架構是非常有用的。即以同一個namespace MyProject;開頭的檔案,它們是同一個命名空間。所以注意檔案之間可不要有相同的類/函數/常量名哦。
當然同一個檔案也可以定義多個命名空間,不過非常不建議這樣做的。(瞭解同一個檔案定義多個命名空間)
5、命名空間如何使用
命名空間有三種使用形式:
. 非限定名稱 -- 沒有使用任何的分割符,直接使用類/函數/常量名,如:new Foo(); foo(); echo FOO; 當檔案有使用命名空間時,
複製代碼 代碼如下:

<?php
namespace MyObject;
new Foo(); // 調用MyObjectFoo();
foo(); //調用MyObjectFoo();
echo FOO; //調用MyObjectFOO;    

非完全限定名稱 -- 不是以分割符開頭,如 new SubFoo(); 這種形式與非限定名稱方式一樣。
複製代碼 代碼如下:

<?php
namespace MyObject; new SubFoo(); //調用MyObjectSubFoo();

完全限定名稱 -- 以分割符開頭的方式,相當於作業系統裡的絕對位址。如 new OtherNSFoo();
複製代碼 代碼如下:

<?php
namespace MyObject; new OtherNSFoo(); //調用OtherNsFoo(); 不管MyObject命名空間。

Tip: 對於函數和常量,還有一個特殊的地方(後備全域函數/常量)。
複製代碼 代碼如下:

<?php
namespace MyObject;
funcname(); //如果MyObjectFuncname存在則調用MyObjectFuncname(),否則試著調用funcname(); echo FOO; //同上。

對於類,也有一個特殊的地方。
複製代碼 代碼如下:

<?php
namespace MyObject;
new Foo(); //*如果MyObjectFoo存在,調用之,如果不存在,調用__autoload試著載入MyObjectFoo類進來。
//注意對於類是不會去自動去調用全域範圍下的類的。

之前說了,命名空間還有一個用途-取別名。
複製代碼 代碼如下:

namespace MyObject;
use OtherNSSub as Other;
use OtherNSSub2; //相當於use OtherNSSub2 as Sub2;
use /MyClass;
new Foo(); //調用MyObjectFoo();
new OtherFoo(); //調用 OtherNSSubFoo();
new Sub2Foo(); //調用OtherNSSub2Foo();
new MyClass(); //調用MyClass();

6、動態命名空間
動態總是能讓人摸不著頭腦,然而又帶來靈活性。命名空間同樣可以使用動態語言特點,但要注意由於直接調用命名空間是編譯時間解析的,而動態特徵並非編譯時間解析。所以一定要加首碼。如:
複製代碼 代碼如下:

namespace MyObjectSub;
new Foo(); //調用 MyObjectSubFoo(), 編譯時間已經解析成MyObjectSubFoo
$a = 'Foo';
new $a(); //調用的是Foo(),而不是MyObjectSubFoo()
$b = 'MyObjectSubFoo'; //等價於 MyObjectSubFoo
new $b(); //調用MyObjectSubFoo()
//如果使用雙引號,要用\,如 $a = "\MyObject\Sub";

附1:同一個檔案定義多個命名空間
方法有兩種:

複製代碼 代碼如下:

namespace MyProject;
const CONNECT_OK = 1;
class Connection { /* ... */ }
function connect() { /* ... */  }
namespace AnotherProject;
const CONNECT_OK = 1;
class Connection { /* ... */ }
function connect() { /* ... */  }

方法一,記流水帳。

複製代碼 代碼如下:

namespace MyProject {
const CONNECT_OK = 1;
class Connection { /* ... */ }
function connect() { /* ... */  }
}
namespace AnotherProject {
const CONNECT_OK = 1;
class Connection { /* ... */ }
function connect() { /* ... */  }
}
namespace { //全域
const CONNECT_OK = 1;
class Connection { /* ... */ }
function connect() { /* ... */  }
}

方法二,使用大括弧把同一個命名空間的代碼放在大括弧裡。這種方法,要求在大括弧外不能有任何除了declare之外的代碼。對於全域範圍的代碼使用沒有空間名的大括弧包圍起來。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.