国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發(fā) > PHP > 正文

php命名空間學習筆記

2024-05-04 21:47:44
字體:
來源:轉載
供稿:網(wǎng)友

1、命名空間是一種特殊的作用域,它包含處于該作用域下的標識符,同時它本身也是一種標識符,可以把命名空間與操作系統(tǒng)的目錄對應起來,一個命名空間相當于一個目錄,命名空間里的類,函數(shù),常量,相當于目錄里的文件,同一個目錄(命名空間)里的文件名不能相同,但是不同的目錄里可以有相同名字的文件.

2、使用命名空間為了解決什么問題?

解決名字沖突,比如定義了一個類,正好這個類與PHP內(nèi)部的類或是include進來的一個類庫里的類重名了.

提高代碼可讀性,命名空間有一個別名功能,它可以幫你給一個長達十幾個字符的類名起一個別名,從而縮短代碼,也不用擔心與其他空間的命名沖突.

3、哪一些代碼會受命名空間的影響.

三類:類、函數(shù)、常量。只有它們兄弟三受影響,其他的該干嘛,還干嘛去,說到常量,php 5.3以后可以使用const關鍵字來定義常量,5.3這前使用define,命名空間只對const關鍵字有效.

4、命名空間如何定義,代碼如下:

  1. namespace MyProject; 
  2. const CONNECT_OK = 1;//php5.3以后 
  3. class Connection { /* ... */ } 
  4. function connect() { /* ... */  } 
  5. #例子二 
  6. namespace MyProjectSubLevel; 
  7. const CONNECT_OK = 1;//php5.3以后 
  8. class Connection { /* ... */ } 
  9. function connect() { /* ... */  } 

使用 `namespace 空間名` 來申明一個空間,在namespace之前除了declare語句不能有任何其他php語句,同時也不能有任何非php代碼,連空格都不能有.

以下為錯誤的形式,代碼如下:

$a = 1;namespace MyProject;

//Fatal error: Namespace declaration statement has to be the very first statement in the script...

另外同一個命名空間是可以定義在多個文件中,這對于組織框架是非常有用的,即以同一個namespace MyProject;開頭的文件,它們是同一個命名空間,所以注意文件之間可不要有相同的類/函數(shù)/常量名.

當然同一個文件也可以定義多個命名空間,不過非常不建議這樣做的(了解同一個文件定義多個命名空間)

5、命名空間如何使用

命名空間有三種使用形式:

非限定名稱 -- 沒有使用任何的分割符,直接使用類/函數(shù)/常量名,如:new Foo(); foo(); echo FOO; 當文件有使用命名空間時,代碼如下:

  1. namespace MyObject; 
  2. new Foo(); // 調(diào)用MyObjectFoo(); 
  3. foo(); //調(diào)用MyObjectFoo(); 
  4. echo FOO; //調(diào)用MyObjectFOO;   

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

namespace MyObject; new SubFoo(); //調(diào)用MyObjectSubFoo();

完全限定名稱 -- 以分割符開頭的方式,相當于操作系統(tǒng)里的絕對地址,如 new OtherNSFoo();代碼如下:

namespace MyObject; new OtherNSFoo(); //調(diào)用OtherNsFoo();不管MyObject命名空間.

Tip:對于函數(shù)和常量,還有一個特殊的地方(后備全局函數(shù)/常量).代碼如下:

  1. namespace MyObject; 
  2. funcname(); //如果MyObjectFuncname存在則調(diào)用MyObjectFuncname(),否則試著調(diào)用funcname(); echo FOO; //同上 

對于類,也有一個特殊的地方,代碼如下:

  1. namespace MyObject; 
  2. new Foo(); //*如果MyObjectFoo存在,調(diào)用之,如果不存在,調(diào)用__autoload試著加載MyObjectFoo類進來 

注意對于類是不會去自動去調(diào)用全局作用域下的類的.之前說了,命名空間還有一個用途-取別名,代碼如下:

  1. namespace MyObject; 
  2. use OtherNSSub as Other; 
  3. use OtherNSSub2; //相當于use OtherNSSub2 as Sub2; 
  4. use /MyClass; 
  5. new Foo(); //調(diào)用MyObjectFoo(); 
  6. new OtherFoo(); //調(diào)用 OtherNSSubFoo(); 
  7. new Sub2Foo(); //調(diào)用OtherNSSub2Foo(); 
  8. new MyClass(); //調(diào)用MyClass(); 

6、動態(tài)命名空間

動態(tài)總是能讓人摸不著頭腦,然而又帶來靈活性,命名空間同樣可以使用動態(tài)語言特點,但要注意由于直接調(diào)用命名空間是編譯時解析的,而動態(tài)特征并非編譯時解析,所以一定要加前綴,代碼如下:

  1. namespace MyObjectSub; 
  2. new Foo(); //調(diào)用 MyObjectSubFoo(), //編譯時已經(jīng)解析成MyObjectSubFoo 
  3. $a = 'Foo'
  4. new $a(); //調(diào)用的是Foo(),而不是MyObjectSubFoo() 
  5. $b = 'MyObjectSubFoo'//等價于 MyObjectSubFoo 
  6. new $b(); //調(diào)用MyObjectSubFoo() 
  7. //如果使用雙引號,要用/,如 $a = "/MyObject/Sub"; 

附1:同一個文件定義多個命名空間,方法有兩種:

  1. namespace MyProject; 
  2. const CONNECT_OK = 1; 
  3. class Connection { /* ... */ } 
  4. function connect() { /* ... */  } 
  5. namespace AnotherProject; 
  6. const CONNECT_OK = 1; 
  7. class Connection { /* ... */ } 
  8. function connect() { /* ... */  } 

方法一,記流水帳,代碼如下:

  1. namespace MyProject { 
  2. const CONNECT_OK = 1; 
  3. class Connection { /* ... */ } 
  4. function connect() { /* ... */  } 
  5. namespace AnotherProject { 
  6. const CONNECT_OK = 1; 
  7. class Connection { /* ... */ } 
  8. function connect() { /* ... */  } 
  9. namespace { //全局 
  10. const CONNECT_OK = 1; 
  11. class Connection { /* ... */ } 
  12. function connect() { /* ... */  } 

方法二,使用大括號把同一個命名空間的代碼放在大括號里,這種方法,要求在大括號外不能有任何除了declare之外的代碼,對于全局作用域的代碼使用沒有空間名的大括號包圍起來.

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 甘肃省| 即墨市| 繁昌县| 淮南市| 宝坻区| 岗巴县| 漾濞| 台山市| 涟水县| 安乡县| 临洮县| 类乌齐县| 沧州市| 海晏县| 平陆县| 历史| 南川市| 太和县| 昌吉市| 石棉县| 东丰县| 嘉黎县| 恭城| 贵溪市| 汶上县| 炎陵县| 札达县| 泸州市| 诸城市| 开江县| 英超| 鄂托克旗| 山东省| 保亭| 阳信县| 辽宁省| 瑞昌市| 汨罗市| 福州市| 辽宁省| 芒康县|