国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 語言 > PHP > 正文

Yii2框架類自動加載機制實例分析

2024-05-05 00:03:31
字體:
來源:轉載
供稿:網友

本文實例講述了Yii2框架類自動加載機制。分享給大家供大家參考,具體如下:

在yii中,程序中需要使用到的類無需事先加載其類文件,在使用的時候才自動定位類文件位置并加載之,這么高效的運行方式得益于yii的類自動加載機制。

Yii的類自動加載實際上使用的是PHP的類自動加載,所以先來看看PHP的類自動加載。在PHP中,當程序中使用的類未加載時,在報錯之前會先調用魔術方法__autoload(),所以我們可以重寫__autoload()方法,定義當一個類找不到的時候怎么去根據類名稱找到對應的文件并加載它。其中__autoload()方法被稱為類自動加載器。當我們需要多個類自動加載器的時候,我們可以使用spl_autoload_register()方法代替__autoload()來注冊多個類自動加載器,這樣就相當于有多個__autoload()方法。spl_autoload_register()方法會把所有注冊的類自動加載器存入一個隊列中,你可以通過設置它的第三個參數為true來指定某個加載器放到隊列的最前面以確保它最先被調用。Yii的類自動加載機制就是基于spl_autoload_register()方法的。

Yii的類自動加載機制要從它的入口文件index.php說起了,該文件源碼如下:

<?phpdefined('YII_DEBUG') or define('YII_DEBUG', true);//運行模式defined('YII_ENV') or define('YII_ENV', 'dev');//運行環(huán)境require(__DIR__ . '/../../vendor/autoload.php');//composer的類自動加載文件require(__DIR__ . '/../../vendor/yiisoft/yii2/Yii.php');//yii的工具類文件(包含了yii類自動加載)require(__DIR__ . '/../../common/config/bootstrap.php');//主要用于執(zhí)行一些yii應用引導的代碼require(__DIR__ . '/../config/bootstrap.php');$config = yii/helpers/ArrayHelper::merge(  require(__DIR__ . '/../../common/config/main.php'),  require(__DIR__ . '/../../common/config/main-local.php'),  require(__DIR__ . '/../config/main.php'),  require(__DIR__ . '/../config/main-local.php'));(new yii/web/Application($config))->run();

文件中第4、5行代碼分別引入了composer的類自動加載文件和yii的工具類文件Yii.php,Yii.php文件源碼如下:

require(__DIR__ . '/BaseYii.php');class Yii extends /yii/BaseYii{}spl_autoload_register(['Yii', 'autoload'], true, true);//注冊yii的類自動加載器Yii::$classMap = require(__DIR__ . '/classes.php');//引入類名到類文件路徑的映射Yii::$container = new yii/di/Container();

這個文件定義了Yii類繼承自/yii/BaseYii,代碼的第6行引入了classes.php文件,該文件源碼:

return [ 'yii/base/Action' => YII2_PATH . '/base/Action.php', 'yii/base/ActionEvent' => YII2_PATH . '/base/ActionEvent.php',  ....//省略n多元素 'yii/widgets/Pjax' => YII2_PATH . '/widgets/Pjax.php', 'yii/widgets/PjaxAsset' => YII2_PATH . '/widgets/PjaxAsset.php', 'yii/widgets/Spaceless' => YII2_PATH . '/widgets/Spaceless.php',];

通過查看其源碼可以看到,這個文件返回了一個從類名稱到類文件路徑的映射數組。這個數組被賦值給Yii::$classMap。代碼的第7行調用了spl_autoload_register()方法注冊了一個類自動加載器,這個類加載器為Yii::autoload(),這就是yii的類加載器了。同時這里通過把spl_autoload_register()方法第三個參數賦值為true,把yii的類加載器放在了加載器隊列的最前面,所以當訪問一個未加載的類的時候,yii的類自動加載器會最先被調用。

下面我們就來看看yii的類自動加載器Yii::autoload()到底做了些什么,這個方法實際上在yii/BaseYii類中,源碼如下:

/** * 類自動加載器 * @param type $className:要加載的類的名稱 * @return type * @throws UnknownClassException */public static function autoload($className){  if (isset(static::$classMap[$className])) {//要加載的類在 類名=>類文件路徑 映射中找到    $classFile = static::$classMap[$className];    if ($classFile[0] === '@') {//若類文件路徑使用了別名,進行別名解析獲得完整路徑      $classFile = static::getAlias($classFile);    }  } elseif (strpos($className, '//') !== false) {//類名需要包含'/'才符合規(guī)范    $classFile = static::getAlias('@' . str_replace('//', '/', $className) . '.php', false);//進行別名解析(說明類名必須以有效的根別名打頭)    if ($classFile === false || !is_file($classFile)) {      return;    }  } else {    return;  }  include($classFile);//引入需要加載的類文件  if (YII_DEBUG && !class_exists($className, false) && !interface_exists($className, false) && !trait_exists($className, false)) {    throw new UnknownClassException("Unable to find '$className' in file: $classFile. Namespace missing?");  }}

這個方法首先會根據需要加載的類的名稱去Yii::$classMap這個映射數組中查找,若存在則引入對應的類文件,不存在則進行別名解析得到完整文件路徑,這里也說明若使用的類不在YII::$classMap中事先定義,則類名必須以有效的根別名打頭,否則無法找到對應文件。

就這樣,在yii中無需在程序中事先加載一大堆可能會使用到的類文件,當使用到某個類的時候,yii的類自動加載器就會自動進行加載了,高效又便捷!

希望本文所述對大家基于Yii框架的PHP程序設計有所幫助。


注:相關教程知識閱讀請移步到PHP教程頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表

圖片精選

主站蜘蛛池模板: 香港 | 崇义县| 济源市| 沙河市| 霍城县| 彭州市| 绥阳县| 绥芬河市| 定西市| 嘉黎县| 任丘市| 河曲县| 怀来县| 丽水市| 昆明市| 海城市| 肇庆市| 崇阳县| 同心县| 沁水县| 峨边| 寿阳县| 揭西县| 囊谦县| 宣汉县| 金门县| 施秉县| 宁河县| 磴口县| 营口市| 贡觉县| 黔南| 上饶市| 泰兴市| 汉川市| 峨边| 贵德县| 镇平县| 商河县| 广水市| 富平县|