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/"
? ? ? ? }
}