成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

Yii2性能優(yōu)化之:類的延遲加載技術(shù)介紹

tuniutech / 1985人閱讀

摘要:據(jù)官方介紹,框架廣泛的使用了一種叫做延遲加載的技術(shù),從而達(dá)到這樣的效果。比如我們?cè)谂袛嘀?,需要?shí)例化類的時(shí)候,再去加載相應(yīng)的文件。代碼如下等于不等于優(yōu)化過(guò)后的文件效率肯定得到了提升,這個(gè)也就是類的延遲加載雛形。這就是的延遲加載了。

Yii框架號(hào)稱最高效的PHP框架,執(zhí)行效率高出其他框架很多。據(jù)官方介紹,Yii框架廣泛的使用了一種叫做延遲加載的技術(shù),從而達(dá)到這樣的效果。

下面我們就通過(guò)實(shí)例詳細(xì)的來(lái)介紹一下這個(gè)技術(shù)

類的延遲加載

首先我們?cè)?b>www目錄新建2個(gè)類Class1、Class2和一個(gè)index.php文件。

Class1Class2中我們只簡(jiǎn)單的寫一個(gè)簡(jiǎn)單結(jié)構(gòu)

Class1.php

class Class1{

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

Class2.php

class Class2{

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

}

接下來(lái)我們?cè)?b>index.php文件中引入這兩個(gè)類

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

同時(shí)我們?cè)俣x一個(gè)變量$state,將其值設(shè)置為1。我們?cè)賹?duì)$state做一些判斷操作。

$state = 1;

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

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

代碼正常運(yùn)行。但是我們發(fā)現(xiàn),我們?cè)?b>if中實(shí)例化Class1Class2。不管何時(shí),都只能實(shí)例化其中的一個(gè),而我們?cè)谝胛募臅r(shí)候,卻是一次性的將兩個(gè)類都引入進(jìn)來(lái)了。這樣不可避免的造成了一些資源的浪費(fèi)。

所以,我們可以先進(jìn)行一些小的優(yōu)化。

比如:我們?cè)?b>if判斷中,需要實(shí)例化類的時(shí)候,再去加載相應(yīng)的文件。代碼如下:

$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();
}

優(yōu)化過(guò)后的index.php文件效率肯定得到了提升,這個(gè)也就是類的延遲加載雛形。但是這樣就會(huì)出現(xiàn)一個(gè)問(wèn)題,在需要加載的文件很多時(shí)候,并不是太方便。通用性不是很強(qiáng)。

在Yii中,這個(gè)問(wèn)題被很好的解決。

其核心武器就是spl_autoload_register()函數(shù),該函數(shù)可以自動(dòng)執(zhí)行函數(shù)。
其括號(hào)中參數(shù)為需要執(zhí)行的函數(shù)的函數(shù)名。比如我們定義一個(gè)函數(shù),叫fun_loader().然后將fun_loader作為spl_autoload_register()的參數(shù),那么在程序運(yùn)行時(shí)候,就會(huì)自動(dòng)的執(zhí)行fun_loader函數(shù)。

我們先在index.php函數(shù)頂部加入代碼

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

spl_autoload_register("fun_loader");

這樣程序在運(yùn)行時(shí)候就會(huì)自動(dòng)調(diào)用函數(shù)fun_loader,并且輸出123

有了自動(dòng)調(diào)用函數(shù)功能,我們就可以把剛剛的需要加載的兩個(gè)類放入這個(gè)函數(shù),達(dá)到自動(dòng)加載的效果。

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

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

所以,fun_loader的參數(shù)起作用了,我們可以動(dòng)態(tài)的將需要加載的類傳遞進(jìn)來(lái),實(shí)現(xiàn)按需加載。

我們將改造后的index.php完整的寫出來(lái),如下:

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();
}

這樣,當(dāng)實(shí)例化的時(shí)候,如果發(fā)現(xiàn)沒(méi)有找到相應(yīng)的類。那么就會(huì)執(zhí)行一下fun_loader函數(shù)。同時(shí),將實(shí)例化的類名作為參數(shù),傳遞給fun_loader

這樣就可以實(shí)現(xiàn)需要時(shí)候加載需要的類。這就是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();

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/30423.html

相關(guān)文章

  • YII2通過(guò)composer優(yōu)化vendor

    摘要:本文討論通過(guò)工具安裝框架并優(yōu)化過(guò)程中遇到的問(wèn)題,約定讀者對(duì)基本原理有一定了解,并且有安裝框架的實(shí)際經(jīng)驗(yàn)。這個(gè)命令是優(yōu)化包的關(guān)鍵一環(huán)。命令要謹(jǐn)慎使用。 本文討論通過(guò)composer工具安裝Yii2框架并優(yōu)化Vendor過(guò)程中遇到的問(wèn)題,約定讀者對(duì)composer基本原理有一定了解,并且有安裝Yii2框架的實(shí)際經(jīng)驗(yàn)。 在Yii2社區(qū)里經(jīng)常會(huì)遇到一類問(wèn)題,那就是 安裝完官方推薦的版本后1 ...

    dcr309duan 評(píng)論0 收藏0
  • Yii修行路 - Extension 擴(kuò)展

    摘要:運(yùn)行來(lái)安裝指定的擴(kuò)展。這更便于用戶辨別是否是的擴(kuò)展。當(dāng)用戶運(yùn)行安裝一個(gè)擴(kuò)展時(shí),文件會(huì)被自動(dòng)更新使之包含新擴(kuò)展的信息。上述代碼表明該擴(kuò)展依賴于包。例如,上述的條目聲明將對(duì)應(yīng)于別名。為達(dá)到這個(gè)目的,你應(yīng)當(dāng)在公開發(fā)布前做測(cè)試。 簡(jiǎn)述 擴(kuò)展是專門設(shè)計(jì)的在 Yii 應(yīng)用中隨時(shí)可拿來(lái)使用的, 并可重發(fā)布的軟件包。 基礎(chǔ) 例如, yiisoft/yii2-debug 擴(kuò)展在你的應(yīng)用的每個(gè)頁(yè)面底部添加...

    bovenson 評(píng)論0 收藏0
  • Vue.js應(yīng)用性能優(yōu)化:第一部分---介紹性能優(yōu)化和懶加載

    摘要:我的目標(biāo)是使本系列成為關(guān)于應(yīng)用程序性能的完整指南。代碼分割就是將應(yīng)用程序分割成這些延遲加載的塊??偨Y(jié)延遲加載是提高應(yīng)用程序性能并減少其大小的最佳方法之一。在本系列的下一部分中,我將向您展示如何使用和路由來(lái)分割應(yīng)用程序代碼。 當(dāng)移動(dòng)優(yōu)先(mobile-first)的方式逐漸成為一種標(biāo)準(zhǔn),而不確定的網(wǎng)絡(luò)環(huán)境因素應(yīng)該始終是我們考慮的一點(diǎn),因此保持讓應(yīng)用程序快速加載變得越來(lái)越困難。在本系列文章...

    ZweiZhao 評(píng)論0 收藏0
  • Java設(shè)計(jì)模式-單例模式(Singleton Pattern)

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

    k00baa 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<