天天躁日日躁狠狠躁AV麻豆-天天躁人人躁人人躁狂躁-天天澡夜夜澡人人澡-天天影视香色欲综合网-国产成人女人在线视频观看-国产成人女人视频在线观看

php命名空間學習詳解

1、什么是命名空間?
命名空間是一種特殊的作用域,它包含處于該作用域下的標識符,同時它本身也是一種標識符??梢园衙臻g與操作系統的目錄對應起來。一個命名空間相當于一個目錄,命名空間里的類,函數,常量,相當于目錄里的文件。同一個目錄(命名空間)里的文件名不能相同,但是不同的目錄里可以有相同名字的文件。
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之外的代碼。對于全局作用域的代碼使用沒有空間名的大括號包圍起來。

php技術php命名空間學習詳解,轉載需保留來源!

鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。

主站蜘蛛池模板: 久久视频在线视频观看精品15 | 99久久国内精品成人免费 | 向日葵视频app下载18岁以下勿看 | 日本精品久久久久中文字幕 | 伊人香蕉在线播放视频免费 | va亚洲va天堂va视频在线 | 成人性生交大片免费看4 | 四库影院永久国产精品 | 一本道色综合手机久久 | 最近中文字幕完整版免费高清 | 成人在免费视频手机观看网站 | 飘雪韩国在线观看免费高清完整版 | 国产精品嫩草影院 | 亚洲国产精品第一影院在线观看 | 依人青青青在线观看 | 欧美狂野乱码一二三四区 | 多男同时插一个女人8p | 久久久大香菇 | 日本黄色网站在线观看 | 亚洲 日韩 欧美 另类 蜜桃 | 久久成人无码国产免费播放 | 久久久无码精品亚洲日韩按摩 | 成年免费大片黄在线观看岛国 | 中国xxx视频| 99精品视频一区在线视频免费观看 | 538久久视频在线 | 国产精品第3页 | 伊人亚洲综合网色 | 国产午夜精品自在自线之la | 國產日韓亞洲精品AV | 久久夜色撩人精品国产 | 国产成人拍精品免费视频爱情岛 | 谁有成人网站地址 | 青青草久久伊人 | 玩弄人妻少妇500系列网址 | 欧美深夜0000XXXX疯狂 | 精品水蜜桃久久久久久久 | 国产福利视频一区二区 | 国产在线精品一区二区网站免费 | jizz非洲| 国产在线一区二区AV视频 |