從 php 5.3 起 PHP 多了 命名空間/延遲靜態繫結/lambda匿名函數 等主要特性
命名空間的引用進一步提升了php的代碼結構的靈活性和可控性,方便將項目的各工具類進行歸類管理
各 php 架構則是利用命名空間做檔案路徑映射自動載入的功能
下面我們拿 Yii2 做一次剖析
先看一下 Yii2的控制器書寫規則
controllers\IndexController.php
1、某命名空間下的類 的完整名稱為 namespace\className,當在某命名空間上下文中訪問其它命名空間下的類時,我們可以使用 use 做別名化,或者使用此類的完整名稱,但要以 '\' 根命名空間開頭,否則解譯器會認為你是在當前命名空間上下文中調用,即 foo\bar 方式會以 currentNamespace\foo\bar的方式去載入
命名空間與linux檔案系統很相似,'\' 代表根,不以根開始的皆認為以當前命名空間為基點
2、use 只是給你使用的類定義短別名,use foo\bar 後則new bar() 即new \foo\bar(),還有個小技巧,當我們同時引用不同命名空間下的類名相同的類時可以使用 as 為其定義一個新別名
use foo\bar\sameName as classA;use bar\foo\sameName as classB;new classA(); // new \foo\bar\sameName;new classB(); // new \bar\foo\sameName;
3、當我們通過 入口檔案 載入參數配置 執行個體化一個應用主體 載入路由群組件解析請求 指派控制器調用方法時,期間會調用其他的類,比如
use yii\web\Controller;
系統便會去通過自動載入函數做最一次載入嘗試,若仍載入不到此類則報錯
下面我們看下 Yii2 從入口檔案開始一個應用實體後註冊自動載入函數的流程
index.php
入口檔案載入配置和系統架構時會使用require調用,因為現在還沒有註冊自動載入函數
載入 Yii bootstrap 檔案時便通過 spl_autoload_register 註冊了自動載入函數
Yii.php
Yii2的自動載入函數
繼承至 BaseYii 它要做的就是根據你命名空間類型的類名去映射為此類所在的檔案路徑
比如 yii\web\Controller類會根據 yii 而映射到 YII2_PATH . '/web/Controller.php' 檔案中,而這個檔案則是命名空間為 yii\web 的 Controller 類,將此檔案載入即可訪問 yii\web\Controller 類
而我們自己編寫的控制器或者模型則訪問時為 'app\controllers\IndexController' 'app\models\EntryForm'
則 autoload 函數會根據 app 為 映射關鍵字將其定位到 controllers 或 models 檔案夾下從而讀取對應的檔案即可載入相應的類,這也是為什麼 類名 與 檔案名稱 相互對應的原因所在,若不存在對應,則你只能通過固定的 require 某個檔案去載入你寫在其中的類了