PHP 命名空間與AUTOLOAD

PHP自5.3版本就有了命名空間的特性,作為C++程序員出身,命名空間的概念的含義就無須贅述了。PHP作為一種腳本語言,不存在程序入口,所以腳本無法順序執(zhí)行,即使面向?qū)ο箝_發(fā),也缺少極佳的模塊劃分導(dǎo)入機制。

從早期的include 或require一大堆文件,到PHP5中的magic method:__autoload,調(diào)用一個未定義類時會自動調(diào)用此函數(shù),從而在拋出錯誤前做最后的補救【方法的實質(zhì)就是逐個文件目錄窮搜索式查找,“投降前的最后一次嘗試”】,再到現(xiàn)在取而代__autoload的spl_autoload_regisger(),不再“漫無目的”的窮搜索,而是針對不同的用途類別,分批autoload,詳解如下:

bool spl_autoload_register ([ callable $autoload_function [, bool $throw = true [, bool $prepend = false ]]] )

autoload_function 是需要注冊的自動裝載函數(shù),如果此項為空,則會注冊 spl_autoload 函數(shù)。


考慮到PHP作為腳本語言無程序入口的局限性,模塊導(dǎo)入機制的本質(zhì)無非完成“類文件名==》磁盤文件”的映射以加載。基于PSR4命名空間規(guī)范【雖然命名空間為PHP5.3語言自帶特性】,有些框架中實現(xiàn)了根據(jù)命名空間實現(xiàn)類庫的自動加載的機制,比如ThinkPHP5,但不幸若沒有【比如CodeIgniter3】倒也可以簡單如下示例做一個Loader類,或者通過第三方類庫如composer來實現(xiàn)其他類庫的自動加載。

方案一:簡化版Loader類

下面代碼截圖為個人自寫,測試過的簡化版Loader:


最后在入口處index.php中spl_autoload_register('Loader::autoload'); 就妥妥的加載了使用過程中的具體模塊了。

方案二: Composer實現(xiàn)命名空間類的自動加載

可參見:http://www.maoxuner.cn/2017/03/24/ci3-composer.html

two tips:1.文章中有一句話:“因其作為控制器在瀏覽器中訪問,因此不能給它設(shè)置命名空間,即不不能包含namaspace語句。”這句話毫無緣由啊,i:namespace只是指定了邏輯上隔離的空間而已,如若要同一套代碼,通過index指定不同的命名空間,從而控制不同的邏輯處理也并不無可能??;2. 個人已嘗試,控制器中包含namespace使用正常,也無何種?提示。不曉得作者何出此言,如有大神,望指明。

2. ?composer.json

"autoload": {

? ? ? ? "psr-4": {

? ? ? ? ? ? ? ? "app\\":"application/"

? ? ? ? }

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容