欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時間:2018年05月02日 10:03:37   作者:編程人,在天涯  
這篇文章主要介紹了Yii2框架類自動加載機制,結(jié)合實例形式分析了Yii框架類自動加載機制的原理與實現(xiàn)方法,需要的朋友可以參考下

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

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

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

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

<?php
defined('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應(yīng)用引導(dǎo)的代碼
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',
];

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

下面我們就來看看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?");
  }
}

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

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

更多關(guān)于Yii相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Yii框架入門及常用技巧總結(jié)》、《php優(yōu)秀開發(fā)框架總結(jié)》、《smarty模板入門基礎(chǔ)教程》、《php面向?qū)ο蟪绦蛟O(shè)計入門教程》、《php字符串(string)用法總結(jié)》、《php+mysql數(shù)據(jù)庫操作入門教程》及《php常見數(shù)據(jù)庫操作技巧匯總

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

相關(guān)文章

  • 基于PHP實現(xiàn)短信驗證碼接口(容聯(lián)運通訊)

    基于PHP實現(xiàn)短信驗證碼接口(容聯(lián)運通訊)

    本文分步驟給大家講解了短信驗證碼接口(容聯(lián)運通訊)實現(xiàn)代碼,非常不錯,具有參考借鑒價值,感興趣的朋友一起看看吧
    2016-09-09
  • PHP生成帶有雪花背景的驗證碼

    PHP生成帶有雪花背景的驗證碼

    晚看到了chianren上的驗證碼效果,就考慮了一下,用PHP的GD庫完成了類似功能 先成生背景,再把生成的驗證碼放上去
    2008-09-09
  • PhpStorm2020.1 安裝 debug - Postman 調(diào)用的詳細(xì)教程

    PhpStorm2020.1 安裝 debug - Postman 調(diào)用的詳細(xì)教程

    這篇文章主要介紹了PhpStorm2020.1 安裝 debug - Postman 調(diào)用的詳細(xì)教程,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-08-08
  • Yii使用CLinkPager分頁實例詳解

    Yii使用CLinkPager分頁實例詳解

    這篇文章主要介紹了Yii使用CLinkPager分頁的方法,需要的朋友可以參考下
    2014-07-07
  • php如何用PDO操作大數(shù)據(jù)對象

    php如何用PDO操作大數(shù)據(jù)對象

    我們在使用數(shù)據(jù)庫時,很少會向數(shù)據(jù)庫中存儲很大的內(nèi)容字段。但是,MySQL 其實也為我們準(zhǔn)備了這種類型的存儲,只是我們平常用得不多而已。今天我們就來學(xué)習(xí)了解一下使用 PDO 如何操作 MySQL 中的大數(shù)據(jù)對象。
    2021-06-06
  • Laravel框架FormRequest中重寫錯誤處理的方法

    Laravel框架FormRequest中重寫錯誤處理的方法

    這篇文章主要介紹了Laravel框架FormRequest中重寫錯誤處理的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-02-02
  • php實現(xiàn)socket推送技術(shù)的示例

    php實現(xiàn)socket推送技術(shù)的示例

    下面小編就為大家分享一篇php實現(xiàn)socket推送技術(shù)的示例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2017-12-12
  • 在Thinkphp中使用ajax實現(xiàn)無刷新分頁的方法

    在Thinkphp中使用ajax實現(xiàn)無刷新分頁的方法

    這篇文章主要介紹了在Thinkphp中使用ajax實現(xiàn)無刷新分頁的方法的相關(guān)資料,非常不錯具有參考借鑒價值,需要的朋友可以參考下
    2016-10-10
  • PHP實現(xiàn)的簡單mock json腳本分享

    PHP實現(xiàn)的簡單mock json腳本分享

    這篇文章主要介紹了PHP實現(xiàn)的簡單mock json腳本分享,本文直接給出實現(xiàn)代碼,需要的朋友可以參考下
    2015-02-02
  • 詳解HTTP Cookie狀態(tài)管理機制

    詳解HTTP Cookie狀態(tài)管理機制

    cookie 最早是網(wǎng)景公司的雇員 Lou Montulli 在1993年3月發(fā)明,后被 W3C 采納,目前 cookie 已經(jīng)成為標(biāo)準(zhǔn),所有的主流瀏覽器如 IE、Chrome、Firefox、Opera 等都支持
    2016-01-01

最新評論