PHP自5.3版本就有了命名空間的特性膘怕,作為C++程序員出身召庞,命名空間的概念的含義就無(wú)須贅述了。PHP作為一種腳本語(yǔ)言忘古,不存在程序入口髓堪,所以腳本無(wú)法順序執(zhí)行,即使面向?qū)ο箝_發(fā)干旁,也缺少極佳的模塊劃分導(dǎo)入機(jī)制炮沐。
從早期的include 或require一大堆文件,到PHP5中的magic method:__autoload换薄,調(diào)用一個(gè)未定義類時(shí)會(huì)自動(dòng)調(diào)用此函數(shù)专控,從而在拋出錯(cuò)誤前做最后的補(bǔ)救【方法的實(shí)質(zhì)就是逐個(gè)文件目錄窮搜索式查找遏餐,“投降前的最后一次嘗試”】,再到現(xiàn)在取而代__autoload的spl_autoload_regisger()柏蘑,不再“漫無(wú)目的”的窮搜索,而是針對(duì)不同的用途類別咳焚,分批autoload,詳解如下:
bool spl_autoload_register ([ callable $autoload_function [, bool $throw = true [, bool $prepend = false ]]] )
autoload_function 是需要注冊(cè)的自動(dòng)裝載函數(shù)碑定,如果此項(xiàng)為空又官,則會(huì)注冊(cè) spl_autoload 函數(shù)。
考慮到PHP作為腳本語(yǔ)言無(wú)程序入口的局限性六敬,模塊導(dǎo)入機(jī)制的本質(zhì)無(wú)非完成“類文件名==》磁盤文件”的映射以加載外构。基于PSR4命名空間規(guī)范【雖然命名空間為PHP5.3語(yǔ)言自帶特性】撼班,有些框架中實(shí)現(xiàn)了根據(jù)命名空間實(shí)現(xiàn)類庫(kù)的自動(dòng)加載的機(jī)制割笙,比如ThinkPHP5眯亦,但不幸若沒有【比如CodeIgniter3】倒也可以簡(jiǎn)單如下示例做一個(gè)Loader類,或者通過(guò)第三方類庫(kù)如composer來(lái)實(shí)現(xiàn)其他類庫(kù)的自動(dòng)加載乱顾。
方案一:簡(jiǎn)化版Loader類
下面代碼截圖為個(gè)人自寫宫静,測(cè)試過(guò)的簡(jiǎn)化版Loader:
最后在入口處index.php中spl_autoload_register('Loader::autoload'); 就妥妥的加載了使用過(guò)程中的具體模塊了孤里。
方案二: Composer實(shí)現(xiàn)命名空間類的自動(dòng)加載
可參見:http://www.maoxuner.cn/2017/03/24/ci3-composer.html
two tips:1.文章中有一句話:“因其作為控制器在瀏覽器中訪問(wèn),因此不能給它設(shè)置命名空間捌袜,即不不能包含namaspace語(yǔ)句∨螅”這句話毫無(wú)緣由啊,i:namespace只是指定了邏輯上隔離的空間而已侯养,如若要同一套代碼澄干,通過(guò)index指定不同的命名空間,從而控制不同的邏輯處理也并不無(wú)可能跋⒊摺疾掰;2. 個(gè)人已嘗試,控制器中包含namespace使用正常炭懊,也無(wú)何種?提示侮腹。不曉得作者何出此言,如有大神父阻,望指明望抽。
2. ?composer.json
"autoload": {
? ? ? ? "psr-4": {
? ? ? ? ? ? ? ? "app\\":"application/"
? ? ? ? }
}