国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Yii2性能優化之:類的延遲加載技術介紹

tuniutech / 1899人閱讀

摘要:據官方介紹,框架廣泛的使用了一種叫做延遲加載的技術,從而達到這樣的效果。比如我們在判斷中,需要實例化類的時候,再去加載相應的文件。代碼如下等于不等于優化過后的文件效率肯定得到了提升,這個也就是類的延遲加載雛形。這就是的延遲加載了。

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

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

類的延遲加載

首先我們在www目錄新建2個類Class1Class2和一個index.php文件。

Class1Class2中我們只簡單的寫一個簡單結構

Class1.php

class Class1{

    public function __construct(){
        echo "class1";
    }
    
}

Class2.php

class Class2{

    public function __construct(){
        echo "class2";
    }

}

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

require_once("Class1.php");
require_once("Class2.php");

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

$state = 1;

if($state == 1)
{
    echo "state 等于 1";
    $class1 = new Class1();
}
else
{
    echo "state 不等于 1";
    $class2 = new Class2();
}

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

代碼正常運行。但是我們發現,我們在if中實例化Class1Class2。不管何時,都只能實例化其中的一個,而我們在引入文件的時候,卻是一次性的將兩個類都引入進來了。這樣不可避免的造成了一些資源的浪費。

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

比如:我們在if判斷中,需要實例化類的時候,再去加載相應的文件。代碼如下:

$state = 1;

if($state == 1)
{
    echo "state 等于 1";
    require_once("Class1.php");
    $class1 = new Class1();
}
else
{
    echo "state 不等于 1";
    require_once("Class2.php");
    $class2 = new Class2();
}

優化過后的index.php文件效率肯定得到了提升,這個也就是類的延遲加載雛形。但是這樣就會出現一個問題,在需要加載的文件很多時候,并不是太方便。通用性不是很強。

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

其核心武器就是spl_autoload_register()函數,該函數可以自動執行函數。
其括號中參數為需要執行的函數的函數名。比如我們定義一個函數,叫fun_loader().然后將fun_loader作為spl_autoload_register()的參數,那么在程序運行時候,就會自動的執行fun_loader函數。

我們先在index.php函數頂部加入代碼

function fun_loader($value)
{
    echo "123";
}

spl_autoload_register("fun_loader");

這樣程序在運行時候就會自動調用函數fun_loader,并且輸出123

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

function fun_loader($value)
{
    require_once("Class1.php");
    require_once("Class2.php");
}

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

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

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

function fun_loader($value)
{
    require_once($value.".php");
}

spl_autoload_register("fun_loader");

$state = 1;

if($state == 1)
{
    echo "state 等于 1";
    $class1 = new Class1();
}
else
{
    echo "state 不等于 1";
    $class2 = new Class2();
}

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

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

Yii具體的代碼在文件vendoryiisoftyii2Yii.php


 * @since 2.0
 */
class Yii extends yiiBaseYii
{
}

spl_autoload_register(["Yii", "autoload"], true, true);
Yii::$classMap = require(__DIR__ . "/classes.php");
Yii::$container = new yiidiContainer();

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/30423.html

相關文章

  • YII2通過composer優化vendor

    摘要:本文討論通過工具安裝框架并優化過程中遇到的問題,約定讀者對基本原理有一定了解,并且有安裝框架的實際經驗。這個命令是優化包的關鍵一環。命令要謹慎使用。 本文討論通過composer工具安裝Yii2框架并優化Vendor過程中遇到的問題,約定讀者對composer基本原理有一定了解,并且有安裝Yii2框架的實際經驗。 在Yii2社區里經常會遇到一類問題,那就是 安裝完官方推薦的版本后1 ...

    dcr309duan 評論0 收藏0
  • Yii修行路 - Extension 擴展

    摘要:運行來安裝指定的擴展。這更便于用戶辨別是否是的擴展。當用戶運行安裝一個擴展時,文件會被自動更新使之包含新擴展的信息。上述代碼表明該擴展依賴于包。例如,上述的條目聲明將對應于別名。為達到這個目的,你應當在公開發布前做測試。 簡述 擴展是專門設計的在 Yii 應用中隨時可拿來使用的, 并可重發布的軟件包。 基礎 例如, yiisoft/yii2-debug 擴展在你的應用的每個頁面底部添加...

    bovenson 評論0 收藏0
  • Vue.js應用性能優化:第一部分---介紹性能優化和懶加載

    摘要:我的目標是使本系列成為關于應用程序性能的完整指南。代碼分割就是將應用程序分割成這些延遲加載的塊。總結延遲加載是提高應用程序性能并減少其大小的最佳方法之一。在本系列的下一部分中,我將向您展示如何使用和路由來分割應用程序代碼。 當移動優先(mobile-first)的方式逐漸成為一種標準,而不確定的網絡環境因素應該始終是我們考慮的一點,因此保持讓應用程序快速加載變得越來越困難。在本系列文章...

    ZweiZhao 評論0 收藏0
  • Java設計模式-單例模式(Singleton Pattern)

    摘要:如果需要防范這種攻擊,請修改構造函數,使其在被要求創建第二個實例時拋出異常。單例模式與單一職責原則有沖突。源碼地址參考文獻設計模式之禪 定義 單例模式是一個比較簡單的模式,其定義如下: 保證一個類僅有一個實例,并提供一個訪問它的全局訪問點。 或者 Ensure a class has only one instance, and provide a global point of ac...

    k00baa 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<