91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

使用Yii2框架怎么實現類自動加載機制

發布時間:2021-06-07 16:10:05 來源:億速云 閱讀:143 作者:Leah 欄目:開發技術

今天就跟大家聊聊有關使用Yii2框架怎么實現類自動加載機制,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。

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

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

<?php
defined('YII_DEBUG') or define('YII_DEBUG', true);//運行模式
defined('YII_ENV') or define('YII_ENV', 'dev');//運行環境
require(__DIR__ . '/../../vendor/autoload.php');//composer的類自動加載文件
require(__DIR__ . '/../../vendor/yiisoft/yii2/Yii.php');//yii的工具類文件(包含了yii類自動加載)
require(__DIR__ . '/../../common/config/bootstrap.php');//主要用于執行一些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) {//類名需要包含'\'才符合規范
    $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?");
  }
}

看完上述內容,你們對使用Yii2框架怎么實現類自動加載機制有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

鲁山县| 治多县| 平陆县| 辰溪县| 正宁县| 伊吾县| 嘉鱼县| 大庆市| 沙雅县| 岱山县| 吴堡县| 邳州市| 山阳县| 凤台县| 平利县| 繁昌县| 兴宁市| 澜沧| 东至县| 治县。| 乌兰县| 延寿县| 台州市| 蕉岭县| 灌云县| 遵化市| 赤城县| 尼勒克县| 盖州市| 沧州市| 台中市| 洱源县| 大英县| 上高县| 汉沽区| 稻城县| 汶上县| 甘肃省| 绿春县| 泰来县| 彭山县|