成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

php命名空間簡介

cangck_X / 1173人閱讀

摘要:全局命名空間接觸過系統(tǒng)的同學(xué)都應(yīng)該知道根目錄吧,我們可以將全局命名空間想象為的根目錄,在該目錄下存放的都是本身提供的各種接口類函數(shù)常量。

以下是我對命名空間的一些體會(huì)和理解,最好先看下php的官方文檔再來看此文,會(huì)更好一點(diǎn)。由于水平有限,文中如有紕漏,希望指出

前言

在php5.3以上的版本中,php引入了命名空間(以下稱呼為namespace)這個(gè)性能。個(gè)人認(rèn)為,這是非常重要的一項(xiàng)改變。之所以說重要,并不是說namespace本身有多么牛逼或者多高的技術(shù)含量。而是由于命名空間的引入,引起了一些列的連鎖反應(yīng),這些連鎖反應(yīng)給我們現(xiàn)在phper開發(fā)者提供了另一種可能。

現(xiàn)在的開發(fā)方式


我們在以往開發(fā)應(yīng)用的時(shí)候,即使是非常簡單的應(yīng)用,也經(jīng)常使用php的那些框架,他們通常很重、很大、很難學(xué),更要命的是,還很多,什么Yii2、Thinkphp、CI、ZendFrame、Laravel......好吧我不想說了。

另一種可能


現(xiàn)在呢,我們似乎有了另外一種選擇。依靠composer包管理工具,加載packagist上面那些優(yōu)秀的組件,然后通過composer提供的自動(dòng)加載機(jī)制,將組建應(yīng)用到項(xiàng)目中去。我們的開發(fā)似乎變成了擺積木,我們要做的事情只是將組件恰當(dāng)?shù)慕M合起來,怎么樣,聽著是不是很心動(dòng)是么?全世界優(yōu)秀的輪子隨我用,這個(gè)feel倍爽?。?!哦,離題有點(diǎn)遠(yuǎn)了,那么這和本文的主題namespacey又有什么關(guān)系呢?當(dāng)然有關(guān)系了,自動(dòng)加載的基石namespace

實(shí)現(xiàn)另外一種可能很重要的一步就是,將packagist組件自動(dòng)加載到應(yīng)用中。由于php的_autoload有各種各樣的實(shí)現(xiàn)方式,為此php-fig(php framework interop group一個(gè)php組織)提出了psr-0(已經(jīng)廢棄)和psr-4,這兩個(gè)專門自動(dòng)加載的解決方案,其核心思想就是:將命名空間和實(shí)際的磁盤物理路徑建立映射

(ps : 到目前為止spr-0、spr-4只是推薦的自動(dòng)加載解決方案,并沒有強(qiáng)制,但事實(shí)上,基本都采用了這種自動(dòng)加載方式。除了spr-和spr-4外,composer還支持file 和classmap的方式)

為什么會(huì)有命名空間,它解決了什么問題?

命名空間出現(xiàn)的根本原因是為了解決命名沖突的問題,個(gè)人認(rèn)為主要是為了解決以下命名沖突


用戶自定義的接口/類/trait/函數(shù)/常量 同 php系統(tǒng)提供的 接口/類/trait/函數(shù)/常量命名沖突

用戶自定義的接口/類/trait/函數(shù)/常量 同 第三方框架提供的 接口/類/trait/函數(shù)/常量命名沖突

舉個(gè)例子


我們經(jīng)常使用var_dump進(jìn)行斷點(diǎn)調(diào)試,這個(gè)是系統(tǒng)提供給我們的內(nèi)置函數(shù)。但是呢,有的程序員對var_dump輸出的數(shù)據(jù)格式不是很滿意,希望自己寫一個(gè)var_dump函數(shù)(var_dump用時(shí)間長了,叫其他的名字不習(xí)慣),自己格式化其輸出信息,但是報(bào)錯(cuò)!

========================================
" echo $message; echo "
========================================
" } /** * 報(bào)錯(cuò)信息:PHP Fatal error: Cannot redeclare var_dump() */
命名空間的一些基礎(chǔ)概念?

我將采用類比的方法來說明這些高深的概念,盡量能讓大家清楚。

全局命名空間


接觸過linux系統(tǒng)的同學(xué)都應(yīng)該知道根目錄"/"吧,我們可以將全局命名空間想象為linux的根目錄,在該目錄下存放的都是php本身提供的各種接口/類/trait/函數(shù)/常量。

完全限定名稱


以全局命名空間為前綴的名稱,例如, $a = new currentnamespacefoo(); 或 currentnamespacefoo::staticmethod();我們可以將其類比為絕對路徑

限定名稱


不以全局命名空間為前綴的名稱,例如,$a = new subnamespacefoo();或subnamespacefoo::staticmethod();我們可以將其類比為相對路徑

非限定名稱


不包含任何前綴的名稱,例如, $a=new foo(); 或 foo::staticmethod();我們可以將其類比一個(gè)問文件名稱或者目錄名稱

php中的那些要素會(huì)受到命名空間的影響?

首先肯定一點(diǎn),并不是所有的元素都受到命名空間的影響,比如說變量就不會(huì),只有以下php要素會(huì)受到影響:

類(class)

接口(interface)

trait

常量(constant)

方法名(function,我認(rèn)為object里面的方法是method)

什么是別名/導(dǎo)入?命名空間的解析規(guī)則是什么?兩者又有什么關(guān)系? 什么是別名/導(dǎo)入?

我們可以認(rèn)為別名/導(dǎo)入,類似是windows下的快捷方式或者是linux下的軟鏈,通過該快捷方式我們可以鏈接到,別的空間下的class、interface、trait、constant、function,甚至可以是單純的連接到別的命名空間而不特指該空間下的任何元素。下面舉個(gè)例子

當(dāng)我們的代碼中有以別名打頭的情況時(shí),php就會(huì)嘗試鏈接到別名對應(yīng)的命名空間中的元素,或是別名對應(yīng)的命名空間,然后拼接剩余的名稱,如果有的話。例子中NSnamesubnsfunc(); 檢查到NSname是別名,所以先鏈接到MyFullNSname, 然后拼接剩余名稱MyFullNSnamesubnsfunc();

(ps:導(dǎo)入的名稱必須是完全限定的,不會(huì)根據(jù)當(dāng)前的命名空間作相對解析,前導(dǎo)的反斜杠是不必要的也不推薦的)

命名空間的解析規(guī)則是什么?

一圖勝千言,還是上圖吧

從圖中,可以看出主要是從完全限定名和非完全限定名這兩塊進(jìn)行分析的。

兩者的關(guān)系是什么?

由上圖,我們可以知道,限定名稱和非限定名稱的解析都會(huì)受到別名的影響。
而且,別名的優(yōu)先級比當(dāng)前命名空間的優(yōu)先級高(很多地方都沒有說)
也就是說,在一個(gè)命名空間下,限定名稱和非限定名稱會(huì)先嘗試尋找別名替換,如果找不到對應(yīng)的別名,才會(huì)將當(dāng)前的命名空間追加到現(xiàn)在的名字前面組成完全限定名

Test();

a.php和b.php兩個(gè)文件在同一個(gè)目錄下:在b.php文件中,在namespace Top下面,擁有別名TestTop as Top,所以new TopB() 會(huì)被解釋成 new TestTopB(),也就是將別名進(jìn)行了替換; 而并不是new TopTopB(),將當(dāng)前空間名添加到現(xiàn)在的名字前面。所以此時(shí)的運(yùn)行結(jié)果是:xxxx/b.php

命名空間的一些易錯(cuò)點(diǎn),僅個(gè)人體會(huì)

1、class 、interface 、traits和const 、function嘗試執(zhí)行的加載策略不同

2、一個(gè)文件中,只有第一個(gè)namespace聲明命名空間前不能有任何字符,特別是bom頭(看不見但是存在),其他的namespace不做限制。

3、namespace本身并不分區(qū)大小寫,相同名字的namespace認(rèn)為是同一個(gè)空間


參考資料

http://php.net/manual/zh/lang...
《Modern php》

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/21697.html

相關(guān)文章

  • PHP 擴(kuò)展開發(fā)】Zephir 簡介

    摘要:什么是是一種中間語言,以接近的語法來編寫代碼,然后轉(zhuǎn)換編譯成擴(kuò)展,旨在簡化擴(kuò)展的創(chuàng)建和可維護(hù)性。如果成功,會(huì)自動(dòng)生成文件到目錄你需要編輯填加擴(kuò)展測試一下就這樣,你也會(huì)擴(kuò)展開發(fā)了附附編譯擴(kuò)展的方法 什么是 Zephir Zephir 是一種中間語言,以接近 PHP 的語法來編寫代碼,然后轉(zhuǎn)換編譯成 PHP 擴(kuò)展,旨在簡化 PHP 擴(kuò)展的創(chuàng)建和可維護(hù)性。利用編譯來提高性能和資源消耗,又不需...

    arashicage 評論0 收藏0
  • Typecho Framework: Hello world!

    摘要:是所用的框架,本文將介紹如何用這個(gè)框架寫一個(gè)程序。在目錄下建立目錄,并在其中創(chuàng)建文件首先我們定義一個(gè)命名空間,我們的程序使用為命名空間。入口程序這樣基本上就完成了。會(huì)自動(dòng)在目錄下找模板文件,約定大于配置。 Typecho Framework是SegmentFault所用的框架,本文將介紹如何用這個(gè)框架寫一個(gè)Hello World程序。如果你不了解Typecho Framework,請先...

    fish 評論0 收藏0
  • Phalcon入門教程之目錄結(jié)構(gòu)

    摘要:原文發(fā)表于入門教程之目錄結(jié)構(gòu)很多初學(xué)的朋友,對于以框架為基礎(chǔ)構(gòu)建的項(xiàng)目,應(yīng)該如何組織目錄結(jié)構(gòu)有點(diǎn)摸不著頭腦。只需要通過注冊這些目錄結(jié)構(gòu),即可正常使用。 原文發(fā)表于:Phalcon入門教程之目錄結(jié)構(gòu) 很多初學(xué)Phalcon的朋友,對于以Phalcon框架為基礎(chǔ)構(gòu)建的項(xiàng)目,應(yīng)該如何組織目錄結(jié)構(gòu)有點(diǎn)摸不著頭腦。比如多模塊的項(xiàng)目中,如何共用libs類庫和models目錄中模型類的情況,就有很...

    reclay 評論0 收藏0
  • Composer管理PHP依賴關(guān)系

    摘要:然而各自為政的打包方式依賴關(guān)系的處理,導(dǎo)致了很難將兩個(gè)開源項(xiàng)目集成到一起。雖然有這種官方支持的包管理工具,但是依然沒有很好的統(tǒng)一的依賴關(guān)系管理的辦法。項(xiàng)目編譯和打包依賴關(guān)系的解決都可以很輕松的實(shí)現(xiàn)。 簡介 現(xiàn)在軟件規(guī)模越來越大,PHP項(xiàng)目的開發(fā)模式和許多年前已經(jīng)有了很大變化。記得初學(xué)PHP那會(huì)兒,boblog是一個(gè)很好的例子,幾乎可以代表PHP項(xiàng)目的開發(fā)模式。當(dāng)時(shí)PHP 5.x以上的版...

    Mertens 評論0 收藏0
  • composer

    摘要:自動(dòng)加載為了實(shí)現(xiàn)類的隨取隨用,類的命名空間定義建議遵從一定的規(guī)則。這種規(guī)則可以是某一項(xiàng)目組約定的。不過為了使得類庫統(tǒng)一,項(xiàng)目指定了一種命名空間的規(guī)范,被一些流行項(xiàng)目采用。用來指定在軟件包級別上區(qū)別。注意默認(rèn)類庫是使用規(guī)范自動(dòng)加載的。 簡介 composer是一個(gè)php中管理依賴的工具。它使你可以在項(xiàng)目中聲明用到的包/庫,之后它會(huì)自動(dòng)安裝相關(guān)包。 Composer is not a ...

    Miyang 評論0 收藏0

發(fā)表評論

0條評論

最新活動(dòng)
閱讀需要支付1元查看
<