亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > PHP > 正文

PHP命名空間(Namespace)的使用詳解

2020-03-22 20:26:22
字體:
供稿:網(wǎng)友
對于命名空間,官方文檔已經(jīng)說得很詳細(xì)[查看],我在這里做了一下實踐和總結(jié)。命名空間一個最明確的目的就是解決重名問題,PHP中不允許兩個函數(shù)或者類出現(xiàn)相同的名字,否則會產(chǎn)生一個致命的錯誤。這種情況下只要避免命名重復(fù)就可以解決,最常見的一種做法是約定一個前綴。例:項目中有兩個模塊:article和message board,它們各自有一個處理用戶留言的類Comment。之后我可能想要增加對所有用戶留言的一些信息統(tǒng)計功能,比如說我想得到所有留言的數(shù)量。這時候調(diào)用它們Comment提供的方法是很好的做法,但是同時引入各自的Comment類顯然是不行的,代碼會出錯,在另一個地方重寫任何一個Comment也會降低維護(hù)性。那這時只能重構(gòu)類名,我約定了一個命名規(guī)則,在類名前面加上模塊名,像這樣:Article_Comment、MessageBoard_Comment可以看到,名字變得很長,那意味著以后使用Comment的時候會寫上更多的代碼(至少字符多了)。并且,以后如果要對各個模塊增加更多的一些整合功能,或者是互相調(diào)用,發(fā)生重名的時候就需要重構(gòu)名字。當(dāng)然在項目開始的時候就注意到這個問題,并規(guī)定命名規(guī)則就能很好的避免這個問題。另一個解決方法可以考慮使用命名空間。
注明:本文提到的常量:PHP5.3開始const關(guān)鍵字可以用在類的外部。const和define都是用來聲明常量的(它們的區(qū)別不詳述),但是在命名空間里,define的作用是全局的,而const則作用于當(dāng)前空間。我在文中提到的常量是指使用const聲明的常量。
基礎(chǔ)
命名空間將代碼劃分出不同的空間(區(qū)域),每個空間的常量、函數(shù)、類(為了偷懶,我下邊都將它們稱為元素)的名字互不影響, 這個有點類似我們常常提到的‘封裝'的概念。創(chuàng)建一個命名空間需要使用namespace關(guān)鍵字,這樣:
復(fù)制代碼 代碼如下:
?php//創(chuàng)建一個名為'Article'的命名空間
namespace Article;?

要注意的是,當(dāng)前腳本文件的第一個命名空間前面不能有任何代碼,下面的寫法都是錯誤的:
復(fù)制代碼 代碼如下:
//例一
//在腳本前面寫了一些邏輯代碼 ?php$path = "/";html' target='_blank'>class Comment { }namespace Article;? //例二
//在腳本前面輸出了一些字符 html /html
?phpnamespace Article;?

為什么要說第一個命名空間呢?因為同一腳本文件中可以創(chuàng)建多個命名空間。下面我創(chuàng)建了兩個命名空間,順便為這兩個空間各自添加了一個Comment類元素:
復(fù)制代碼 代碼如下:
?php//創(chuàng)建一個名為'Article'的命名空間
namespace Article;//此Comment屬于Article空間的元素
class Comment { }
//創(chuàng)建一個名為'MessageBoard'的命名空間
namespace MessageBoard;//此Comment屬于MessageBoard空間的元素
class Comment { }
?

在不同空間之間不可以直接調(diào)用其它元素,需要使用命名空間的語法:
復(fù)制代碼 代碼如下:
?phpnamespace Article;class Comment { }
namespace MessageBoard;class Comment { }//調(diào)用當(dāng)前空間(MessageBoard)的Comment類
$comment = new Comment();//調(diào)用Article空間的Comment類
$article_comment = new /Article/Comment();?

可以看到,在MessageBoard空間中調(diào)用article空間里的Comment類時,使用了一種像文件路徑的語法: /空間名/元素名除了類之外,對函數(shù)和常量的用法是一樣的,下面我為兩個空間創(chuàng)建了新的元素,并在MessageBoard空間中輸出了它們的值。
復(fù)制代碼 代碼如下:
?phpnamespace Article;const PATH = '/article';function getCommentTotal() {
return 100;
}class Comment { }
namespace MessageBoard;const PATH = '/message_board';function getCommentTotal() {
return 300;
}class Comment { }//調(diào)用當(dāng)前空間的常量、函數(shù)和類
echo PATH; ///message_board
echo getCommentTotal(); //300
$comment = new Comment();//調(diào)用Article空間的常量、函數(shù)和類
echo /Article/PATH; ///article
echo /Article/getCommentTotal(); //100
$article_comment = new /Article/Comment();?

然后我的確得到了Article空間的元素數(shù)據(jù)。
子空間
命名空間的調(diào)用語法像文件路徑一樣是有道理的,它允許我們自定義子空間來描述各個空間之間的關(guān)系。抱歉我忘了說,article和message board這兩個模塊其實都是處于同一個blog項目內(nèi)。如果用命名空間來表達(dá)它們的關(guān)系,是這樣:
復(fù)制代碼 代碼如下:
?php//我用這樣的命名空間表示處于blog下的article模塊
namespace Blog/Article;class Comment { }
//我用這樣的命名空間表示處于blog下的message board模塊
namespace Blog/MessageBoard;class Comment { }//調(diào)用當(dāng)前空間的類
$comment = new Comment();//調(diào)用Blog/Article空間的類
$article_comment = new /Blog/Article/Comment();?

而且,子空間還可以定義很多層次,比如說 Blog/Article/Archives/Date
公共空間
我有一個common_inc.php腳本文件,里面有一些好用的函數(shù)和類:
復(fù)制代碼 代碼如下:
?phpfunction getIP() { }class FilterXSS { }?

在一個命名空間里引入這個腳本,腳本里的元素不會歸屬到這個命名空間。如果這個腳本里沒有定義其它命名空間,它的元素就始終處于公共空間中:
復(fù)制代碼 代碼如下:
?phpnamespace Blog/Article;//引入腳本文件
include './common_inc.php';$filter_XSS = new FilterXSS(); //出現(xiàn)致命錯誤:找不到Blog/Article/FilterXSS類$filter_XSS = new /FilterXSS(); //正確?

調(diào)用公共空間的方式是直接在元素名稱前加 / 就可以了,否則PHP解析器會認(rèn)為我想調(diào)用當(dāng)前空間下的元素。除了自定義的元素,還包括PHP自帶的元素,都屬于公共空間。要提一下,其實公共空間的函數(shù)和常量不用加 / 也可以正常調(diào)用(不明白PHP為什么要這樣做),但是為了正確區(qū)分元素,還是建議調(diào)用函數(shù)的時候加上 /
名稱術(shù)語
在說別名和導(dǎo)入之前,需要知道關(guān)于空間三種名稱的術(shù)語,以及PHP是怎樣解析它們的。官方文檔說得非常好,我就直接拿來套了。1.非限定名稱,或不包含前綴的類名稱,例如 $comment = new Comment();。如果當(dāng)前命名空間是Blog/Article,Comment將被解析為Blog/Article/Comment。如果使用Comment的代碼不包含在任何命名空間中的代碼(全局空間中),則Comment會被解析為Comment。

2.限定名稱,或包含前綴的名稱,例如 $comment = new Article/Comment();。如果當(dāng)前的命名空間是Blog,則Comment會被解析為Blog/Article/Comment。如果使用Comment的代碼不包含在任何命名空間中的代碼(全局空間中),則Comment會被解析為Comment。

3.完全限定名稱,或包含了全局前綴操作符的名稱,例如 $comment = new /Article/Comment();。在這種情況下,Comment總是被解析為代碼中的文字名(literal name)Article/Comment。
其實可以把這三種名稱類比為文件名(例如 comment.php)、相對路徑名(例如 ./article/comment.php)、絕對路徑名(例如 /blog/article/comment.php),這樣可能會更容易理解。我用了幾個示例來表示它們:
復(fù)制代碼 代碼如下:
?php//創(chuàng)建空間Blog
namespace Blog;class Comment { }//非限定名稱,表示當(dāng)前Blog空間
//這個調(diào)用將被解析成 Blog/Comment();
$blog_comment = new Comment();//限定名稱,表示相對于Blog空間
//這個調(diào)用將被解析成 Blog/Article/Comment();
$article_comment = new Article/Comment(); //類前面沒有反斜桿///完全限定名稱,表示絕對于Blog空間
//這個調(diào)用將被解析成 Blog/Comment();
$article_comment = new /Blog/Comment(); //類前面有反斜桿///完全限定名稱,表示絕對于Blog空間
//這個調(diào)用將被解析成 Blog/Article/Comment();
$article_comment = new /Blog/Article/Comment(); //類前面有反斜桿/
//創(chuàng)建Blog的子空間Article
namespace Blog/Article;class Comment { }?

其實之前我就一直在使用非限定名稱和完全限定名稱,現(xiàn)在它們終于可以叫出它們的名稱了。
別名和導(dǎo)入
別名和導(dǎo)入可以看作是調(diào)用命名空間元素的一種快捷方式。PHP并不支持導(dǎo)入函數(shù)或常量。它們都是通過使用use操作符來實現(xiàn):
復(fù)制代碼 代碼如下:
?phpnamespace Blog/Article;class Comment { }
//創(chuàng)建一個BBS空間(我有打算開個論壇)
namespace BBS;//導(dǎo)入一個命名空間
use Blog/Article;
//導(dǎo)入命名空間后可使用限定名稱調(diào)用元素
$article_comment = new Article/Comment();//為命名空間使用別名
use Blog/Article as Arte;
//使用別名代替空間名
$article_comment = new Arte/Comment();//導(dǎo)入一個類
use Blog/Article/Comment;
//導(dǎo)入類后可使用非限定名稱調(diào)用元素
$article_comment = new Comment();//為類使用別名
use Blog/Article/Comment as Comt;
//使用別名代替空間名
$article_comment = new Comt();?

我注意到,如果導(dǎo)入元素的時候,當(dāng)前空間有相同的名字元素將會怎樣?顯然結(jié)果會發(fā)生致命錯誤。例:
復(fù)制代碼 代碼如下:
?phpnamespace Blog/Article;class Comment { }
namespace BBS;class Comment { }Class Comt { }
//導(dǎo)入一個類
use Blog/Article/Comment;
$article_comment = new Comment(); //與當(dāng)前空間的Comment發(fā)生沖突,程序產(chǎn)生致命錯誤//為類使用別名
use Blog/Article/Comment as Comt;
$article_comment = new Comt(); //與當(dāng)前空間的Comt發(fā)生沖突,程序產(chǎn)生致命錯誤?

動態(tài)調(diào)用
PHP提供了namespace關(guān)鍵字和__NAMESPACE__魔法常量動態(tài)的訪問元素,__NAMESPACE__可以通過組合字符串的形式來動態(tài)訪問:
復(fù)制代碼 代碼如下:
?phpnamespace Blog/Article;const PATH = '/Blog/article';class Comment { }
//namespace關(guān)鍵字表示當(dāng)前空間
echo namespace/PATH; ///Blog/article
$comment = new namespace/Comment();//魔法常量__NAMESPACE__的值是當(dāng)前空間名稱
echo __NAMESPACE__; //Blog/Article
//可以組合成字符串并調(diào)用
$comment_class_name = __NAMESPACE__ . '/Comment';
$comment = new $comment_class_name();?

字符串形式調(diào)用問題

上面的動態(tài)調(diào)用的例子中,我們看到了字符串形式的動態(tài)調(diào)用方式,如果要使用這種方式要注意兩個問題。1. 使用雙引號的時候特殊字符可能被轉(zhuǎn)義
復(fù)制代碼 代碼如下:
?phpnamespace Blog/Article;class name { }//我是想調(diào)用Blog/Article/name
$class_name = __NAMESPACE__ . "/name"; //但是/n將被轉(zhuǎn)義為換行符$name = new $class_name(); //發(fā)生致命錯誤?

2. 不會認(rèn)為是限定名稱PHP在編譯腳本的時候就確定了元素所在的空間,以及導(dǎo)入的情況。而在解析腳本時字符串形式調(diào)用只能認(rèn)為是非限定名稱和完全限定名稱,而永遠(yuǎn)不可能是限定名稱。
復(fù)制代碼 代碼如下:
?phpnamespace Blog;//導(dǎo)入Common類
use Blog/Article/Common;
//我想使用非限定名稱調(diào)用Blog/Article/Common
$common_class_name = 'Common';
//實際會被當(dāng)作非限定名稱,也就表示當(dāng)前空間的Common類,但我當(dāng)前類沒有創(chuàng)建Common類
$common = new $common_class_name(); //發(fā)生致命錯誤:Common類不存在//我想使用限定名稱調(diào)用Blog/Article/Common
$common_class_name = 'Article/Common';
//實際會被當(dāng)作完全限定名稱,也就表示Article空間下的Common類,但我下面只定義了Blog/Article空間而不是Article空間
$common = new $common_class_name(); //發(fā)生致命錯誤:Article/Common類不存在
namespace Blog/Article;class Common { }?

總結(jié)
我對PHP的命名空間剛剛接觸,也不能隨便給一些沒有實踐的建議。我個人認(rèn)為命名空間的作用和功能都很強(qiáng)大,如果要寫插件或者通用庫的時候再也不用擔(dān)心重名問題。不過如果項目進(jìn)行到一定程度,要通過增加命名空間去解決重名問題,我覺得工作量不會比重構(gòu)名字少。也不得不承認(rèn)它的語法會對項目增加一定的復(fù)雜度,因此從項目一開始的時候就應(yīng)該很好的規(guī)劃它,并制定一個命名規(guī)范。
PHP教程

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

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
老色鬼在线视频| 国产亚洲第一区| 你懂的国产精品永久在线| 激情av中文字幕| 中文字幕视频在线免费欧美日韩综合在线看| 亚洲成色www8888| 亚洲色图偷窥| 亚洲欧美日韩国产成人精品影院| 日韩在线视频二区| 91色在线视频| 国产视频网站在线观看| 国产精品av免费| 在线你懂的视频| 久久只有这里有精品| 日本韩国精品一区二区| 亚洲欧美清纯在线制服| 欧美gay男男猛男无套| 天天看片中文字幕| 国产精品va无码一区二区| 亚洲大片在线观看| 色操视频在线| 亚洲电影小说图| 成人午夜视频免费看| 91精品国产91久久久久久青草| 伊人久久一区二区| 国产三级国产精品国产国在线观看| 亚洲国产黄色片| 免费成人在线观看| 天天躁日日躁狠狠躁免费麻豆| xvideos成人免费中文版| 亚洲毛片在线免费| 亚洲九九精品| 久久精品成人动漫| 国产高清www| 国产精品久久久久久久久久久久久| www.亚洲一区二区| 69堂精品视频| 91免费版在线看| 奇米精品在线| 久久噜噜色综合一区二区| 久久精品九色| 青青青国产精品一区二区| 黄色网址大全在线观看| 欧美精品久久一区二区三区| 久久久免费av| 高清不卡一区二区在线| 久久久中精品2020中文| 日本久久久网站| 国产精品久久一区| 欧美 日韩 国产 成人 在线观看| 日韩av免费看| 欧美性做爰毛片| 亚洲综合在线网| 少妇bbw搡bbbb搡bbbb| 亚洲成a人片77777在线播放| 精品污污网站免费看| 国产成人久久777777| 中文字幕在线亚洲| 国产精品久久久久久久av电影| 亚洲色图18p| 在线满18网站观看视频| 色在线免费视频| 麻豆成人入口| 欧美午夜a级限制福利片| 一级欧洲+日本+国产| 在线免费观看黄色片| 91精品国产综合久久男男| 国产精品免费91| 色播视频在线观看| 99久久国产综合精品色伊| 这里只有精品丝袜| 国产亚洲精品成人| 91精品国产综合久久精品麻豆| 国产伦精品一区二区三区免费视频| 欧美人与牲动交xxxxbbbb| 激情综合色播五月| 免费永久视频| xxxxx.日韩| 亚洲影院在线播放| 成人在线免费| 国产日韩欧美精品在线| 亚洲精品在线观看网站| 成人无码精品1区2区3区免费看| 中文字幕无码日韩专区免费| 粗大黑人巨茎大战欧美成人| 欧美丰满高潮xxxx喷水动漫| 亚洲国产乱码最新视频| 欧美色图欧美色图| 嫩模私拍啪啪| 四虎影院在线免费播放| 精品理论电影在线| 久久99视频精品| 在线看片地址| 久久―日本道色综合久久| 依依成人综合视频| 怡红院av亚洲一区二区三区h| 欧美成在线观看| 91成人国产综合久久精品| 日日夜夜精品视频| 在线观看国产麻豆| 91人人澡人人爽人人精品| 五月天色婷婷综合| 欧美色图亚洲激情| 亚洲欧美色图小说| 欧美精品123| 亚洲午夜精品久久久久久人妖| 韩国视频理论视频久久| 久久综合伊人77777蜜臀| 精品欧美一区二区在线观看视频| 国产情侣av在线| 中日韩精品视频在线观看| 国产91丝袜在线18| 亚州视频一区二区三区| 亚洲成人激情社区| 手机在线免费看毛片| 亚洲制服在线观看| 久久久精品国产sm调教网站| 丁香婷婷综合激情| 国产黄色网址在线观看| 韩国午夜理伦三级不卡影院| 欧美一卡二卡在线观看| 久久免费在线观看| 精品捆绑调教一区二区三区| 在线天堂中文字幕| 亚洲精品日产aⅴ| 日本在线不卡一区二区| 亚洲最新无码中文字幕久久| 欧美成人午夜77777| 亚洲精品美女久久久| 超碰在线视屏| 日本欧美一区二区三区不卡视频| 日韩av高清在线| 最近中文字幕大全中文字幕免费| 成人午夜黄色影院| 国产真实伦在线观看| av在线播放一区二区三区| 中文字幕国产一区| 日韩av片在线免费观看| 日韩一区二区三区高清在线观看| 懂色av粉嫩av蜜臀av一区二区三区| 欧洲有码在线视频| 久久久久久久综合狠狠综合| 无码人妻精品一区二区三区9厂| 超碰超碰人人人人精品| 99鲁鲁精品一区二区三区| 亚洲欧美精品午睡沙发| 午夜精品福利一区二区三区av| av电影在线网| 欧美日韩视频在线播放| 真实国产乱子伦对白在线| 草莓视频成人appios| 亚洲国产精品久久人人爱潘金莲| 成人精品视频一区二区三区尤物| 一区二区在线观看av| 国产精品成人一区二区三区电影毛片| 色婷婷久久一区二区三区麻豆| 欧美在线看片a免费观看| 色综合视频在线| 国产成人亚洲一区二区三区| 亚洲精品1区2区| 国产婷婷成人久久av免费高清| 在线视频一区观看| 亚洲人午夜精品天堂一二香蕉| 日韩精品一区二区三区四| 色哟哟一区二区| 人人干视频在线| 日韩精品一区二区三区久久| 精品欧美不卡一区二区在线观看| 蜜臀av一级做a爰片久久| 日韩精品在线观看av| 成人动漫中文字幕| 欧美在线看片a免费观看| 亚洲免费三区一区二区| 国产精品一区视频网站| 欧美色欧美亚洲高清在线视频| 国产一区二区三区成人| 伊人再见免费在线观看高清版| 视频小说一区二区| 日韩精品无码一区二区三区久久久| 中文字幕成人精品久久不卡| 国产精品一区二区视频| 国内精品伊人| 热99re久久精品这里都是免费| 视频一区三区| 日日夜夜精品| 日韩av片免费观看| 狠久久av成人天堂| 中文字幕精品一区二区精品| 成人毛片在线精品国产| 欧美色欧美亚洲另类二区精品| 日韩综合av| 神马一区二区影院| 在线观看视频欧美| 看女生喷水的网站在线观看| **亚洲第一综合导航网站| 亚洲成熟女性毛茸茸| 手机免费av片| 国产主播精品| 欧美激情2020午夜免费观看| 亚洲91精品在线观看| 自拍视频在线| av一区二区三区免费| 天堂在线资源网| 成人香蕉社区| 日韩欧美不卡一区| 亚洲成人福利在线| 中文字幕精品—区二区四季| 国产精品51麻豆cm传媒| 成人黄页毛片网站| 亚洲图片欧美日韩| 4hu四虎永久在线影院成人| 一本岛在线视频| 久久久人成影片免费观看| 免费av在线网站| 欧美一区二区三区在线观看免费| 国产精品一区二区亚洲| 国产一区二区伦理| 亚洲动漫第一页| 国模视频一区| 丰满少妇一区二区| 99九九久久| 精品伦理一区二区三区| 色吊一区二区三区| 欧美成人综合网站| 久久综合狠狠综合久久综青草| 黑人粗进入欧美aaaaa| 亚洲欧洲中文天堂| 九九久久国产精品| 精品国精品国产| 亚洲精品男人的天堂| 国产精品熟女一区二区不卡| 97超碰免费观看| 久久久电影一区二区三区| 国产又黄又猛视频| 日韩欧美精品一区| 亚洲人成毛片在线播放| 成人影院在线免费观看| 国产污视频在线播放| www.欧美日韩国产在线| 欧美日韩国产精品专区| 国产精选久久久| 狠狠做深爱婷婷久久综合一区| 中文字幕亚洲一区二区va在线| 亚洲综合久久av一区二区三区| 日韩精品伦理第一区| 国产成人免费在线观看不卡| 精品国产视频| 国产99精品视频| 日韩风俗一区 二区| 2018高清国产日本一道国产| 日批视频在线免费看| 亚洲乱码中文字幕久久孕妇黑人| 久久av影院| 2020天天干夜夜爽| 亚洲香蕉中文网| 99精品国产视频| 91精品国产91久久久久游泳池| 亚洲免费影院| 亚洲bt欧美bt日本bt| 国产高清一区| 免费成人小视频| 欧美亚洲另类在线一区二区三区| 国产区成人精品视频| 国产欧美日韩中文字幕在线| 国产精品乱人伦中文| 亚洲一级影院| 欧美一区二区激情视频| 国产wwwxxx| 一区 二区 三区| 四虎成人精品在永久免费| 久久艳片www.17c.com| 久久综合婷婷综合| 成人黄色毛片| 日本一级黄色录像| 激情中文字幕| 日韩欧美在线视频日韩欧美在线视频| 2021狠狠干| 91麻豆精品一区二区三区| 国产视频xxxx| 日韩不卡一区| 亚洲黄色片网站| 国产精品一区二区三区精品| www.av在线播放| 天天干天天干天天干天天| 在线中文字幕-区二区三区四区| 国产乱子伦精品无码专区| www.99av.com| 欧美大片日本大片免费观看| 日韩特级毛片| 亚洲男人的天堂av| 91香蕉视频在线播放| 欧美精品99久久久| 日本精品免费观看| 九九热在线免费| 热久久久久久久久| 在线免费毛片| 蜜桃福利午夜精品一区| 亚洲高清视频一区二区| aaa在线播放视频| 人妻无码中文字幕免费视频蜜桃| 国产日韩欧美精品一区二区三区| 亚洲天堂成人在线| 最爽无遮挡行房视频在线| 国产精品传媒麻豆hd| 人人爱人人干婷婷丁香亚洲| 国产一级中文字幕| 悠悠资源av网址| 熟女少妇一区二区三区| 亚洲AV成人无码精电影在线| 国内精品久久久久久久影视蜜臀| 国产三级精品在线观看| 久久av资源网站| 国产精品久久久一区二区| 国产区在线观看成人精品| 国产日韩精品在线观看| 天天综合天天干| 欧美激情在线免费| 久久久国产成人| 欧美日韩在线网站| 在线视频你懂得一区二区三区| 欧美成人国产精品一区二区| 国产乱码精品一区二区三区中文| 亚洲精蜜桃久在线| 国产精品久久久久久久精| 中文字幕一区av| 成年人黄视频在线观看| 91免费看片| 国产精品欧美久久|