yii2框架 yii2自身的自動載入 三

2021-07-11 23:43:35 字數 2733 閱讀 7971

上一節說完了composer的自動載入,下面我們來說一下yii2自身的自動載入。

在我們的入口檔案,例如index.php,**如下:

<?php

// comment out the following two lines when deployed to production

defined('yii_debug') or define('yii_debug', true);

defined('yii_env') or define('yii_env', 'dev');

require(__dir__ . '/../vendor/autoload.php');

require(__dir__ . '/../vendor/yiisoft/yii2/yii.php');

$config = require(__dir__ . '/../config/web.php');

我們可以注意到require(__dir__ . '/../vendor/yiisoft/yii2/yii.php'),將yii2的核心的函式包含進去,下面看看yii.php的**:

<?php

/** * yii bootstrap file.

* * @link

* @license license/

*/require(__dir__ . '/baseyii.php');

/** * yii is a helper class serving common framework functionalities.

* * it extends from [[\yii\baseyii]] which provides the actual implementation.

* by writing your own yii class, you can customize some functionalities of [[\yii\baseyii]].

* * @author qiang xue * @since 2.0

*/class yii extends \yii\baseyii

spl_autoload_register(['yii', 'autoload'], true, true);

yii::$classmap = require(__dir__ . '/classes.php');

yii::$container = new yii\di\container();

首先包含baseyii.php這個基礎的yii檔案,然後類yii繼承包含的yii檔案,命名空間是\yii\baseyii,同時通過spl_autoload_register註冊乙個自動載入函式,這個函式是本類的autoload()函式,這些函式是在\yii\baseyii中定義,而yii類又繼承\yii\baseyii,所以yii類相當於定義這些屬性和方法。

而yii::$classmap = require(__dir__ . '/classes.php')這一句定義了命名空間與實際路徑的對映關係,將返回乙個陣列的形式,儲存在乙個靜態的變數中,那麼這個變數有什麼用呢?

下面我們再來看看spl_autoload_register註冊的autoload()函式,在baseyii.php中定義如下:

public static function autoload($classname)

} elseif (strpos($classname, '\\') !== false)

} else

include($classfile);

if (yii_debug && !class_exists($classname, false) && !inte***ce_exists($classname, false) && !trait_exists($classname, false))

}

其中引數$classname代表的是命名空間的類名,這個函式首先根據類名$classname從$classmap是否可以找到對應設定的對映關係,如果找到對應的對映關係,就把檔案對應的路徑解發布來,賦值變數$classfile,如果找不到對應的對映關係,則將這個命名空間類執行:

$classfile = static::getalias('@' . str_replace('\\', '/', $classname) . '.php'

所以總結一點:

我們可以在定義了別名的資料夾下@***,再建立資料夾aaa,然後定義檔案bbb.php,那麼在bbb.php的檔案的命名空間就是***\aaa,這個檔案的類名就是bbb。那麼我們就可以在任何的地方直接用 new \***\aaa\bbb()的形式類建立例項。發生的過程大概就是這樣子:

a)因為我們在入口檔案首先註冊composer的自動載入函式,放在spl的堆疊中

b)接著,我們又註冊yii2自身的自動載入函式,放在spl的堆疊中,根據棧的後入先出的原則,yii2註冊的函式將放在composer註冊函式的前面,如果要用自動載入函式的話,首先用yii2自身註冊的。

c)所以當我們 new \***\aaa\bbb 的時候,首先會從堆疊中呼叫yii2自身註冊的autoload()函式,查詢在yii2的本身是否存在對應的對映關係,如果找到,就直接包含檔案進來,並例項化。如果找不到,再到yii2定義的別名的資料夾下面找,如果找到,就直接包含檔案進來,並例項化。如果在yii註冊的函式裡都找不到,則接著呼叫spl堆疊的第二個自動函式,即composer自定義的autload()函式,按照函式定義的方式一直往下找,知道找到為止.如果確實找不到會返回錯誤。

yii2框架安裝

下面我把完整的安裝流程介紹給大家 前提 非常重要,你的php版本必須是php5.4以上 去這裡現在高階應用模板 cmd dos命令進入這個d wamp www yii2 advanced下 3.執行 php r readfile php 5.執行php composer.phar global re...

yii2框架 yii2的asset資源包 十一

link license license use yii web assetbundle author qiang xue since 2.0 定義按需載入css方法,注意載入順序在最後 public static function addcss view,cssfile 將需要載入的檔案已陣列聚合...

yii2框架 yii2的主題化設計 十九

最近發現漏了很重要的一章章節知識點 關於yii2的主題化設計。所謂的主題話設計簡單點說就是通過設定不同的模板主題,可以快速切換,無需更改檢視渲染 的方法。在yii2中使用主題,首先要配置主題,在components中 view theme baseurl web themes blue pathma...