前言
很多的小伙伴在,學習 PHP 的時候最早面對的問題之一就是 require 、 include 和 require_once 、include_once 的相愛相殺。
在了解了它們相愛相殺的故事后,往往就開始使用起了框架。框架固然是干活的好工具,但是你知道你平時 new 一個新類的時候,發生了什么嗎?有想過為什么我們 遵循規范 就會自動的幫我們做好一切的加載嗎? 讓我們一切來探索發現其中的奧秘。
時間線 蒸汽時代在 PHP 代碼的頂部你是不是經常看到這樣的代碼。
require "lionis.php"; require "is.php"; require "cool.php";
如果只是引入幾個 PHP 腳本,那還可以接受。那引入成千上萬個腳本的時候,爆炸是在所難免的。如果對一個腳本改了個名字,還需要對引入改腳本的每個腳本改名,能不爆炸嗎?連打出這段話都怎么繞。
電氣時代在 PHP 電氣時代,開始出現了 __autoload 和 spl_autoload_register 函數注冊自定義的自動加載策略。
通俗的來說,__autoload 和 spl_autoload_register 是一個 殺手組織,他們會去雇傭 各國殺手 (函數)。當我們想搞定某個人的時候(new),只需要提供名字(類名),剩下的 殺手 會幫我們搞定的。
PHP 5 開始提供這個函數 傳送門。當你使用的 類 找不到的時候,它把類名當成參數扔進這個函數。
輸出
歐耶耶, 我就是 Lionisspl_autoload_register
如果我們 項目 很大很老又或者你是一個 愛折騰 的少先隊員,需要引入的東西有不一樣的規范,這時候如果都放在 __autoload 函數里,這個函數馬上就會膨脹的。而且 __autoload 是全局唯一的,如果被人占用了,可能會導致錯誤。(欲使一個人滅亡,必將先使其膨脹。)
PHP 5.1.2 開始提供這個函數 傳送門,注冊給定的函數作為 __autoload 的實現。所以,我們看一些框架或插件在自己使用的時候,為了兼容可能會出現 function_exists(spl_autoload_register)。
歐耶,這下我們可以寫很多不同的自動加載函數了。
信息時代師傅小心,前面有妖氣! 。如果我們每個人都自己實現一套自動加載的方法,每個PHP 組件和 框架都使用獨特的自動加載器,而且每個框架使用不同的邏輯加載PHP類、接口和性狀。
那當我們使用一些第三方框架的時候,還需要去弄清楚引導文件中的 自動加載器,那樣是有多和 時間 過不去呢。 PHP-FIG 認識到了這個問題了,推薦使用 PSR-4 規范,來促進組件之間的 互操作性,這樣我們就可以使用一個自動加載器了。
PSR-4 規范
利用命名空間的前綴和文件系統中的目錄對應起來。
映射關系為
namespace => filePath LionisCool => cool帶有命名空間的類
創建一個對象
這個時候,按照 PSR-4 的規范,自動加載器應該去加載 cool/ 目錄下的 Real.php。
不對!那這樣不是還要自己去實現 自動加載器 嘛,不然怎么 無中生有 出現 自動加載器 呢?難道官方 內置 了?
你 out 了吧,我們可以使用依賴管理器 composer 來生成 PSR-4 自動加載器。你可能會疑問,那我的舊項目沒有遵循 PSR-4 規范怎么辦?嘿嘿,讓我們來探索發現一下 composer 是怎么解決這個問題的吧。
Composer哦吼吼,我們這次的重點在與探究自動加載,所以 composer 的安裝和使用等,就不去討論了。
composer 自動加載設置了 4種 加載方式:
PSR-0
PSR-4
classmap
files
PSR-0要求命名空間和目錄層層對應,且可以使用 _ 作為路徑分隔符,但是這會導致目錄結果變得過深。
在 composer 執行 install 等操作時,composer 會把文件中的配置存儲在 vendor/composer/autoload_psr0.php文件中的返回數組中。
例如:定義了VeryGood=>vendorLionisIsRealCool,在調用 use VeryGoodLoveSomeClass,PSR-0 加載的實際目錄為 vendor/Lionis/IsReal/Cool/Very/Good/Love/SomeClass.php。
對吧,這簡直深得嚇人,所以 PSR-0 被官方廢除了。但是一些主流的框架已經實現了 PSR-0,為了向下兼容還是要實現 PSR-0。
composer.json配置:
"autoload": { "psr-0": { "VeryGood": "vendorLionisIsRealCool" } }PSR-4PSR-4 是現在比較推薦的方法,用于替代 PSR-0。
與 PSR-0 不同的是,取消掉了 _ 作為分隔符和目錄結構。在 composer 執行 install 等操作時,composer 會把文件中的配置存儲在 vendor/composer/autoload_psr4.php文件中的返回數組中。
例如:定義了VeryGood=>vendorLionisIsRealCool,在調用 use VeryGood
LoveSomeClass,PSR-4 加載的實際目錄為 vendor/Lionis/IsReal/Cool/Love/SomeClass.php。composer.json配置:
"autoload": { "psr-4": { "VeryGood": "vendorLionisIsRealCool" } }classmapclassmap 通過配置指定的目錄和文件,在 composer 執行 install 等操作時,composer 會去掃描對應的目錄下以.php結尾的文件中的 class,并存儲在 vendor/composer/autoload_classmap.php文件中的返回數組中。
composer.json配置:
"autoload": { "classmap": [ "Lionis/", "Xiaoer/" ] }如果 Lionis 下有一個叫 VeryCool的文件,那么在vendor/composer/autoload_classmap.php 中會生成。
$baseDir . "/Lionis/VeryCool.php", // 其他的映射 );filesfiles 就是直接簡單粗暴的加載文件。在 composer 執行 install 等操作時,composer 會把文件中的配置存儲在 vendor/composer/autoload_static.php文件中的生成一個 $files 數組。
composer.json 配置:
"autoload": { "files": ["Lionis/Very/Cool.php"] }小結composer 通過使用 composer.json,用 json 的格式來指定我們需要自動加載的規則。我們只要在入口文件引入 vendor/autoload.php 就能很方便的便能使用 自動加載。
如果你對 composer 實現 自動加載 的原理感興趣,可以順著 vendor 中的 autoload.php 去看看源碼。
總結從 石器時代 到 信息時代,PHP 經歷了很多試驗和改變后正在變得越來越好。當然,許多優秀的框架讓我們開發速度更快,需要理解的一些知識點也隨之被隱藏起來,讓我們更加專注于實現邏輯。但是,我們有的時候還是要嘗試的去理解他們工作的原理,來提升我們自己。像我老師說過的,所不定一下子踩到狗屎運了呢。
更多細說 PHP 類庫自動加載
一起成長在困惑的城市里總少不了并肩同行的 伙伴 讓我們一起成長。如果您想讓更多人看到文章可以點個 點贊。
如果您想激勵小二可以到 Github 給個 小星星。
如果您想與小二更多交流添加微信 m353839115。
本文原稿來自 PushMeTop
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/22008.html
0.說明 大叔 :二翔 我們要做一個微信公眾號哦。我來教你大概的流程好不好?(開啟裝逼模式中 ) 二翔 :好啊,快講快講。(無限期待中 ) 大叔 :你知道 application/x-www-form-urlencoded是什么嘛? 二翔 :啊咧咧? 大叔 :你知道 php 怎么獲得 raw? 二翔 :啊咧咧? 大叔 :用下面這種方法來實現。 echo file_get_...
摘要:愷英網絡程序經理張皓聰在上,做了直播平臺系統實戰的主題分享,介紹了直播平臺系統的搭建過程。張皓聰年加入愷英網絡,先后負責過多款手游頁游項目,對和有深入研究。確保所有的壓力是平均的。 分享 | 張皓聰(愷英網絡程序經理) 整理 | 西北 2016年10月29日,由又拍云舉辦的Open Talk No.26在魔都上海3W空間成功舉辦,此次活動主要邀請直播領域開發一線的技術大神們聊一聊直播平...
你所不知道的 URL 0.說明 第一幕 產品:大叔有用戶反映賬戶不能綁定公眾號。大叔:啊咧咧?怎么可能,我看看?大叔:恩?這也沒問題啊,魏蝦米。大叔:還是沒問題啊,挖叉類。大叔:T T,話說產品姐姐是不是Java提供接口的時候,沒有對URL進行encodeURI。產品:啊咧咧?我問問看? 第二幕 大叔:小二你給我過來!小二:啊咧咧?怎么了大叔?大叔:知道在URL中的+有時候會變成什么嗎?小二:啊咧...
閱讀 2178·2021-11-24 09:38
閱讀 3242·2021-11-08 13:27
閱讀 3083·2021-09-10 10:51
閱讀 3143·2019-08-29 12:20
閱讀 663·2019-08-28 18:28
閱讀 3459·2019-08-26 11:53
閱讀 2706·2019-08-26 11:46
閱讀 1515·2019-08-26 10:56