摘要:據(jù)官方介紹,框架廣泛的使用了一種叫做延遲加載的技術(shù),從而達到這樣的效果。比如我們在判斷中,需要實例化類的時候,再去加載相應(yīng)的文件。代碼如下等于不等于優(yōu)化過后的文件效率肯定得到了提升,這個也就是類的延遲加載雛形。這就是的延遲加載了。
Yii框架號稱最高效的PHP框架,執(zhí)行效率高出其他框架很多。據(jù)官方介紹,Yii框架廣泛的使用了一種叫做延遲加載的技術(shù),從而達到這樣的效果。
下面我們就通過實例詳細的來介紹一下這個技術(shù)
類的延遲加載首先我們在www目錄新建2個類Class1、Class2和一個index.php文件。
在Class1和Class2中我們只簡單的寫一個簡單結(jié)構(gòu)
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,將其值設(shè)置為1。我們再對$state做一些判斷操作。
$state = 1; if($state == 1) { echo "state 等于 1"; $class1 = new Class1(); } else { echo "state 不等于 1"; $class2 = new Class2(); }
我們判斷$state值,如果為1,則輸出一句話和實例化Class1。否則,同樣輸出一句話,和實例化Class2。
代碼正常運行。但是我們發(fā)現(xiàn),我們在if中實例化Class1或Class2。不管何時,都只能實例化其中的一個,而我們在引入文件的時候,卻是一次性的將兩個類都引入進來了。這樣不可避免的造成了一些資源的浪費。
所以,我們可以先進行一些小的優(yōu)化。
比如:我們在if判斷中,需要實例化類的時候,再去加載相應(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)化過后的index.php文件效率肯定得到了提升,這個也就是類的延遲加載雛形。但是這樣就會出現(xiàn)一個問題,在需要加載的文件很多時候,并不是太方便。通用性不是很強。
在Yii中,這個問題被很好的解決。
其核心武器就是spl_autoload_register()函數(shù),該函數(shù)可以自動執(zhí)行函數(shù)。
其括號中參數(shù)為需要執(zhí)行的函數(shù)的函數(shù)名。比如我們定義一個函數(shù),叫fun_loader().然后將fun_loader作為spl_autoload_register()的參數(shù),那么在程序運行時候,就會自動的執(zhí)行fun_loader函數(shù)。
我們先在index.php函數(shù)頂部加入代碼
function fun_loader($value) { echo "123"; } spl_autoload_register("fun_loader");
這樣程序在運行時候就會自動調(diào)用函數(shù)fun_loader,并且輸出123
有了自動調(diào)用函數(shù)功能,我們就可以把剛剛的需要加載的兩個類放入這個函數(shù),達到自動加載的效果。
function fun_loader($value) { require_once("Class1.php"); require_once("Class2.php"); }
但是這樣還是回歸到了之前的情況,多加載了一個無用的類。
所以,fun_loader的參數(shù)起作用了,我們可以動態(tài)的將需要加載的類傳遞進來,實現(xiàn)按需加載。
我們將改造后的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(); }
這樣,當實例化的時候,如果發(fā)現(xiàn)沒有找到相應(yīng)的類。那么就會執(zhí)行一下fun_loader函數(shù)。同時,將實例化的類名作為參數(shù),傳遞給fun_loader
這樣就可以實現(xiàn)需要時候加載需要的類。這就是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)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/30423.html
摘要:本文討論通過工具安裝框架并優(yōu)化過程中遇到的問題,約定讀者對基本原理有一定了解,并且有安裝框架的實際經(jīng)驗。這個命令是優(yōu)化包的關(guān)鍵一環(huán)。命令要謹慎使用。 本文討論通過composer工具安裝Yii2框架并優(yōu)化Vendor過程中遇到的問題,約定讀者對composer基本原理有一定了解,并且有安裝Yii2框架的實際經(jīng)驗。 在Yii2社區(qū)里經(jīng)常會遇到一類問題,那就是 安裝完官方推薦的版本后1 ...
摘要:運行來安裝指定的擴展。這更便于用戶辨別是否是的擴展。當用戶運行安裝一個擴展時,文件會被自動更新使之包含新擴展的信息。上述代碼表明該擴展依賴于包。例如,上述的條目聲明將對應(yīng)于別名。為達到這個目的,你應(yīng)當在公開發(fā)布前做測試。 簡述 擴展是專門設(shè)計的在 Yii 應(yīng)用中隨時可拿來使用的, 并可重發(fā)布的軟件包。 基礎(chǔ) 例如, yiisoft/yii2-debug 擴展在你的應(yīng)用的每個頁面底部添加...
摘要:我的目標是使本系列成為關(guān)于應(yīng)用程序性能的完整指南。代碼分割就是將應(yīng)用程序分割成這些延遲加載的塊??偨Y(jié)延遲加載是提高應(yīng)用程序性能并減少其大小的最佳方法之一。在本系列的下一部分中,我將向您展示如何使用和路由來分割應(yīng)用程序代碼。 當移動優(yōu)先(mobile-first)的方式逐漸成為一種標準,而不確定的網(wǎng)絡(luò)環(huán)境因素應(yīng)該始終是我們考慮的一點,因此保持讓應(yīng)用程序快速加載變得越來越困難。在本系列文章...
摘要:如果需要防范這種攻擊,請修改構(gòu)造函數(shù),使其在被要求創(chuàng)建第二個實例時拋出異常。單例模式與單一職責(zé)原則有沖突。源碼地址參考文獻設(shè)計模式之禪 定義 單例模式是一個比較簡單的模式,其定義如下: 保證一個類僅有一個實例,并提供一個訪問它的全局訪問點。 或者 Ensure a class has only one instance, and provide a global point of ac...
閱讀 2838·2021-11-25 09:43
閱讀 986·2021-10-11 10:57
閱讀 2491·2020-12-03 17:20
閱讀 3735·2019-08-30 14:05
閱讀 2430·2019-08-29 14:00
閱讀 2000·2019-08-29 12:37
閱讀 1672·2019-08-26 11:34
閱讀 3217·2019-08-26 10:27