Yii2效能優化之 類的延遲載入技術介紹

2021-09-18 02:40:56 字數 2962 閱讀 6379

yii框架號稱最高效的php框架,執行效率高出其他框架很多。據官方介紹,yii框架廣泛的使用了一種叫做延遲載入的技術,從而達到這樣的效果。

下面我們就通過例項詳細的來介紹一下這個技術

首先我們在www目錄新建2個類class1class2和乙個index.php檔案。

class1class2中我們只簡單的寫乙個簡單結構

class1.php

class class1

}class2.php

class class2

}

接下來我們在index.php檔案中引入這兩個類

require_once('class1.php');

require_once('class2.php');

同時我們再定義乙個變數$state,將其值設定為1。我們再對$state做一些判斷操作。

$state = 1;

if($state == 1)

else

我們判斷$state值,如果為1,則輸出一句話和例項化class1。否則,同樣輸出一句話,和例項化class2

**正常執行。但是我們發現,我們在if中例項化class1class2。不管何時,都只能例項化其中的乙個,而我們在引入檔案的時候,卻是一次性的將兩個類都引入進來了。這樣不可避免的造成了一些資源的浪費。

所以,我們可以先進行一些小的優化。

比如:我們在if判斷中,需要例項化類的時候,再去載入相應的檔案。**如下:

$state = 1;

if($state == 1)

else

優化過後的index.php檔案效率肯定得到了提公升,這個也就是類的延遲載入雛形。但是這樣就會出現乙個問題,在需要載入的檔案很多時候,並不是太方便。通用性不是很強。

在yii中,這個問題被很好的解決。

其核心**就是spl_autoload_register()函式,該函式可以自動執行函式。

其括號中引數為需要執行的函式的函式名。比如我們定義乙個函式,叫fun_loader().然後將fun_loader作為spl_autoload_register()的引數,那麼在程式執行時候,就會自動的執行fun_loader函式。

我們先在index.php函式頂部加入**

function fun_loader($value)

spl_autoload_register('fun_loader');

這樣程式在執行時候就會自動呼叫函式fun_loader,並且輸出123

有了自動呼叫函式功能,我們就可以把剛剛的需要載入的兩個類放入這個函式,達到自動載入的效果。

function fun_loader($value)

但是這樣還是回歸到了之前的情況,多載入了乙個無用的類。

所以,fun_loader的引數起作用了,我們可以動態的將需要載入的類傳遞進來,實現按需載入。

我們將改造後的index.php完整的寫出來,如下:

function fun_loader($value)

spl_autoload_register('fun_loader');

$state = 1;

if($state == 1)

else

這樣,當例項化的時候,如果發現沒有找到相應的類。那麼就會執行一下fun_loader函式。同時,將例項化的類名作為引數,傳遞給fun_loader

這樣就可以實現需要時候載入需要的類。這就是yii的延遲載入了。

yii具體的**在檔案vendor\yiisoft\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();

Yii框架之 類的延遲載入例項說明

以例子的方式解釋 現有三個類,class1.php class2.php index.php 在index中 require class class1.php require class class2.php is girl get 0?ture false if is girl else本例存在的...

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

上一節說完了composer的自動載入,下面我們來說一下yii2自身的自動載入。在我們的入口檔案,例如index.php,如下 comment out the following two lines when deployed to production defined yii debug or d...

yii2的自動載入類檔案

一。檢視了一下yii2的載入原理 每個命名空間都有對應的路徑 然後檔名一定要與類名相同 通過yii classmap可設定。或別名也可識別。當我要用乙個不認識的類名時,會自動呼叫魔術方法yii類下的spl autoload register,然後執行autoload方法,在這個方法裡會把對應的類檔案...