首先來看一段簡單的代碼
<?php
namespace app\models;
use yii\db\ActiveRecord;
Class UserInfo extends ActiveRecord
{
public static function tableName(){
return "user_info";
}
}
?>
不考慮Yii框架的情況下,該段代碼肯定是有問題的。因為use關鍵字本身只是對已有的命名空間起個別名,以方便后續可以簡化使用。上面代碼的 use yii\db\ActiveRecord 等價於 use yii\db\ActiveRecord as ActiveRecord.
所以下面用ActiveRecord的時候應該指的是yii\db\ActiveRecord。要想真正使用這個類,必須要include或者require進來實際的php文件的。而這段代碼並沒有顯示的引入。
那么在沒有顯示引入的情況下,這段代碼在Yii框架下是可以正常運行的。
這就說明一個問題,Yii2框架必然是在背后悄悄的把文件給引入了。這個文件並不是由php解釋器解釋,而是先由Yii框架翻譯過后才交由php解釋器的。
Yii怎么識別use的呢?
這就涉及到了Yii2框架的自動加載機制,自動加載機制的原理后續在研究,這里先分析下,yii怎么解析use的。
首先yii根據use的路徑,獲取別名,然后根據別名獲取真實文件路徑,然后通過require或include加載進來。
而對路徑解析的時候分隔目錄中的第一級,例如yii或者app,轉化為別名的時候前面會加上@, @yii和@app別名對應的應該是yii框架目錄的真實路徑和應用程序根目錄的真實路徑。