国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

你所不知道 ? PHP 自動(dòng)加載

sixgo / 1074人閱讀

前言

很多的小伙伴在,學(xué)習(xí) PHP 的時(shí)候最早面對(duì)的問題之一就是 requireincluderequire_onceinclude_once 的相愛相殺。

在了解了它們相愛相殺的故事后,往往就開始使用起了框架。框架固然是干活的好工具,但是你知道你平時(shí) new 一個(gè)新類的時(shí)候,發(fā)生了什么嗎?有想過為什么我們 遵循規(guī)范 就會(huì)自動(dòng)的幫我們做好一切的加載嗎? 讓我們一切來探索發(fā)現(xiàn)其中的奧秘。

時(shí)間線 蒸汽時(shí)代

PHP 代碼的頂部你是不是經(jīng)常看到這樣的代碼。

require "lionis.php";
require "is.php";
require "cool.php";

如果只是引入幾個(gè) PHP 腳本,那還可以接受。那引入成千上萬個(gè)腳本的時(shí)候,爆炸是在所難免的。如果對(duì)一個(gè)腳本改了個(gè)名字,還需要對(duì)引入改腳本的每個(gè)腳本改名,能不爆炸嗎?連打出這段話都怎么繞。

電氣時(shí)代

PHP 電氣時(shí)代,開始出現(xiàn)了 __autoloadspl_autoload_register 函數(shù)注冊(cè)自定義的自動(dòng)加載策略。

通俗的來說,__autoloadspl_autoload_register 是一個(gè) 殺手組織,他們會(huì)去雇傭 各國(guó)殺手 (函數(shù))。當(dāng)我們想搞定某個(gè)人的時(shí)候(new),只需要提供名字(類名),剩下的 殺手 會(huì)幫我們搞定的。

__autoload

PHP 5 開始提供這個(gè)函數(shù) 傳送門。當(dāng)你使用的 找不到的時(shí)候,它把類名當(dāng)成參數(shù)扔進(jìn)這個(gè)函數(shù)。



輸出

歐耶耶, 我就是 Lionis
spl_autoload_register

如果我們 項(xiàng)目 很大很老又或者你是一個(gè) 愛折騰 的少先隊(duì)員,需要引入的東西有不一樣的規(guī)范,這時(shí)候如果都放在 __autoload 函數(shù)里,這個(gè)函數(shù)馬上就會(huì)膨脹的。而且 __autoload 是全局唯一的,如果被人占用了,可能會(huì)導(dǎo)致錯(cuò)誤。(欲使一個(gè)人滅亡,必將先使其膨脹。)

PHP 5.1.2 開始提供這個(gè)函數(shù) 傳送門,注冊(cè)給定的函數(shù)作為 __autoload 的實(shí)現(xiàn)。所以,我們看一些框架或插件在自己使用的時(shí)候,為了兼容可能會(huì)出現(xiàn) function_exists(spl_autoload_register)


歐耶,這下我們可以寫很多不同的自動(dòng)加載函數(shù)了。

信息時(shí)代

師傅小心,前面有妖氣! 。如果我們每個(gè)人都自己實(shí)現(xiàn)一套自動(dòng)加載的方法,每個(gè)PHP 組件框架都使用獨(dú)特的自動(dòng)加載器,而且每個(gè)框架使用不同的邏輯加載PHP類、接口和性狀。

那當(dāng)我們使用一些第三方框架的時(shí)候,還需要去弄清楚引導(dǎo)文件中的 自動(dòng)加載器,那樣是有多和 時(shí)間 過不去呢。 PHP-FIG 認(rèn)識(shí)到了這個(gè)問題了,推薦使用 PSR-4 規(guī)范,來促進(jìn)組件之間的 互操作性,這樣我們就可以使用一個(gè)自動(dòng)加載器了。

PSR-4 規(guī)范

利用命名空間的前綴和文件系統(tǒng)中的目錄對(duì)應(yīng)起來。

映射關(guān)系為

namespace    => filePath
LionisCool => cool

帶有命名空間的類


創(chuàng)建一個(gè)對(duì)象


這個(gè)時(shí)候,按照 PSR-4 的規(guī)范,自動(dòng)加載器應(yīng)該去加載 cool/ 目錄下的 Real.php

不對(duì)!那這樣不是還要自己去實(shí)現(xiàn) 自動(dòng)加載器 嘛,不然怎么 無中生有 出現(xiàn) 自動(dòng)加載器 呢?難道官方 內(nèi)置 了?

out 了吧,我們可以使用依賴管理器 composer 來生成 PSR-4 自動(dòng)加載器。你可能會(huì)疑問,那我的舊項(xiàng)目沒有遵循 PSR-4 規(guī)范怎么辦?嘿嘿,讓我們來探索發(fā)現(xiàn)一下 composer 是怎么解決這個(gè)問題的吧。

Composer

哦吼吼,我們這次的重點(diǎn)在與探究自動(dòng)加載,所以 composer 的安裝和使用等,就不去討論了。

composer 自動(dòng)加載設(shè)置了 4種 加載方式

PSR-0

PSR-4

classmap

files

PSR-0

要求命名空間和目錄層層對(duì)應(yīng),且可以使用 _ 作為路徑分隔符,但是這會(huì)導(dǎo)致目錄結(jié)果變得過深。

composer 執(zhí)行 install 等操作時(shí),composer 會(huì)把文件中的配置存儲(chǔ)在 vendor/composer/autoload_psr0.php文件中的返回?cái)?shù)組中。

例如:定義了VeryGood=>vendorLionisIsRealCool,在調(diào)用 use VeryGoodLoveSomeClass,PSR-0 加載的實(shí)際目錄為 vendor/Lionis/IsReal/Cool/Very/Good/Love/SomeClass.php。

對(duì)吧,這簡(jiǎn)直深得嚇人,所以 PSR-0 被官方廢除了。但是一些主流的框架已經(jīng)實(shí)現(xiàn)了 PSR-0,為了向下兼容還是要實(shí)現(xiàn) PSR-0

composer.json配置:

"autoload": {
    "psr-0": {
        "VeryGood": "vendorLionisIsRealCool"
    }
}
PSR-4

PSR-4 是現(xiàn)在比較推薦的方法,用于替代 PSR-0
PSR-0 不同的是,取消掉了 _ 作為分隔符和目錄結(jié)構(gòu)。

composer 執(zhí)行 install 等操作時(shí),composer 會(huì)把文件中的配置存儲(chǔ)在 vendor/composer/autoload_psr4.php文件中的返回?cái)?shù)組中。

例如:定義了VeryGood=>vendorLionisIsRealCool,在調(diào)用 use VeryGood
LoveSomeClass,PSR-4 加載的實(shí)際目錄為 vendor/Lionis/IsReal/Cool/Love/SomeClass.php。

composer.json配置:

"autoload": {
    "psr-4": {
        "VeryGood": "vendorLionisIsRealCool"
    }
}
classmap

classmap 通過配置指定的目錄和文件,在 composer 執(zhí)行 install 等操作時(shí),composer 會(huì)去掃描對(duì)應(yīng)的目錄下以.php結(jié)尾的文件中的 class,并存儲(chǔ)在 vendor/composer/autoload_classmap.php文件中的返回?cái)?shù)組中。

composer.json配置:

"autoload": {
    "classmap": [
        "Lionis/",
        "Xiaoer/"
    ]
}

如果 Lionis 下有一個(gè)叫 VeryCool的文件,那么在vendor/composer/autoload_classmap.php 中會(huì)生成。

 $baseDir . "/Lionis/VeryCool.php",
    // 其他的映射
);
files

files 就是直接簡(jiǎn)單粗暴的加載文件。在 composer 執(zhí)行 install 等操作時(shí),composer 會(huì)把文件中的配置存儲(chǔ)在 vendor/composer/autoload_static.php文件中的生成一個(gè) $files 數(shù)組。

composer.json 配置:

"autoload": {
    "files": ["Lionis/Very/Cool.php"]
}
小結(jié)

composer 通過使用 composer.json,用 json 的格式來指定我們需要自動(dòng)加載規(guī)則。我們只要在入口文件引入 vendor/autoload.php 就能很方便的便能使用 自動(dòng)加載

如果你對(duì) composer 實(shí)現(xiàn) 自動(dòng)加載 的原理感興趣,可以順著 vendor 中的 autoload.php 去看看源碼。

總結(jié)

石器時(shí)代信息時(shí)代PHP 經(jīng)歷了很多試驗(yàn)和改變后正在變得越來越好。當(dāng)然,許多優(yōu)秀的框架讓我們開發(fā)速度更快,需要理解的一些知識(shí)點(diǎn)也隨之被隱藏起來,讓我們更加專注于實(shí)現(xiàn)邏輯。但是,我們有的時(shí)候還是要嘗試的去理解他們工作的原理,來提升我們自己。像我老師說過的,所不定一下子踩到狗屎運(yùn)了呢。

更多

細(xì)說 PHP 類庫自動(dòng)加載

一起成長(zhǎng)
在困惑的城市里總少不了并肩同行的 伙伴 讓我們一起成長(zhǎng)。

如果您想讓更多人看到文章可以點(diǎn)個(gè) 點(diǎn)贊

如果您想激勵(lì)小二可以到 Github 給個(gè) 小星星

如果您想與小二更多交流添加微信 m353839115

本文原稿來自 PushMeTop

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

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/22008.html

相關(guān)文章

  • 所不知道 ? PHP POST

    0.說明 大叔 :二翔 我們要做一個(gè)微信公眾號(hào)哦。我來教你大概的流程好不好?(開啟裝逼模式中 ) 二翔 :好啊,快講快講。(無限期待中 ) 大叔 :你知道 application/x-www-form-urlencoded是什么嘛? 二翔 :啊咧咧? 大叔 :你知道 php 怎么獲得 raw? 二翔 :啊咧咧? 大叔 :用下面這種方法來實(shí)現(xiàn)。 echo file_get_...

    hlcc 評(píng)論0 收藏0
  • 所不知道 ? PHP Time

    0.說明 凱子:翔逼你知道3月31日加1個(gè)月是幾月幾號(hào)嘛? 翔逼:當(dāng)然是4月30號(hào),泥484傻~ 凱子:真的嘛?你試試下面的代碼。

    JouyPub 評(píng)論0 收藏0
  • 所不知道的直播平臺(tái)IM系統(tǒng)搭建全攻略 | 愷英網(wǎng)絡(luò)張皓聰分享

    摘要:愷英網(wǎng)絡(luò)程序經(jīng)理張皓聰在上,做了直播平臺(tái)系統(tǒng)實(shí)戰(zhàn)的主題分享,介紹了直播平臺(tái)系統(tǒng)的搭建過程。張皓聰年加入愷英網(wǎng)絡(luò),先后負(fù)責(zé)過多款手游頁游項(xiàng)目,對(duì)和有深入研究。確保所有的壓力是平均的。 分享 | 張皓聰(愷英網(wǎng)絡(luò)程序經(jīng)理) 整理 | 西北 2016年10月29日,由又拍云舉辦的Open Talk No.26在魔都上海3W空間成功舉辦,此次活動(dòng)主要邀請(qǐng)直播領(lǐng)域開發(fā)一線的技術(shù)大神們聊一聊直播平...

    kycool 評(píng)論0 收藏0
  • 所不知道 ? URL

    你所不知道的 URL 0.說明 第一幕 產(chǎn)品:大叔有用戶反映賬戶不能綁定公眾號(hào)。大叔:啊咧咧?怎么可能,我看看?大叔:恩?這也沒問題啊,魏蝦米。大叔:還是沒問題啊,挖叉類。大叔:T T,話說產(chǎn)品姐姐是不是Java提供接口的時(shí)候,沒有對(duì)URL進(jìn)行encodeURI。產(chǎn)品:啊咧咧?我問問看? 第二幕 大叔:小二你給我過來!小二:啊咧咧?怎么了大叔?大叔:知道在URL中的+有時(shí)候會(huì)變成什么嗎?小二:啊咧...

    weizx 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

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