摘要:據官方介紹,框架廣泛的使用了一種叫做延遲加載的技術,從而達到這樣的效果。比如我們在判斷中,需要實例化類的時候,再去加載相應的文件。代碼如下等于不等于優化過后的文件效率肯定得到了提升,這個也就是類的延遲加載雛形。這就是的延遲加載了。
Yii框架號稱最高效的PHP框架,執行效率高出其他框架很多。據官方介紹,Yii框架廣泛的使用了一種叫做延遲加載的技術,從而達到這樣的效果。
下面我們就通過實例詳細的來介紹一下這個技術
類的延遲加載首先我們在www目錄新建2個類Class1、Class2和一個index.php文件。
在Class1和Class2中我們只簡單的寫一個簡單結構
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中實例化Class1或Class2。不管何時,都只能實例化其中的一個,而我們在引入文件的時候,卻是一次性的將兩個類都引入進來了。這樣不可避免的造成了一些資源的浪費。
所以,我們可以先進行一些小的優化。
比如:我們在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
摘要:本文討論通過工具安裝框架并優化過程中遇到的問題,約定讀者對基本原理有一定了解,并且有安裝框架的實際經驗。這個命令是優化包的關鍵一環。命令要謹慎使用。 本文討論通過composer工具安裝Yii2框架并優化Vendor過程中遇到的問題,約定讀者對composer基本原理有一定了解,并且有安裝Yii2框架的實際經驗。 在Yii2社區里經常會遇到一類問題,那就是 安裝完官方推薦的版本后1 ...
摘要:運行來安裝指定的擴展。這更便于用戶辨別是否是的擴展。當用戶運行安裝一個擴展時,文件會被自動更新使之包含新擴展的信息。上述代碼表明該擴展依賴于包。例如,上述的條目聲明將對應于別名。為達到這個目的,你應當在公開發布前做測試。 簡述 擴展是專門設計的在 Yii 應用中隨時可拿來使用的, 并可重發布的軟件包。 基礎 例如, yiisoft/yii2-debug 擴展在你的應用的每個頁面底部添加...
摘要:我的目標是使本系列成為關于應用程序性能的完整指南。代碼分割就是將應用程序分割成這些延遲加載的塊。總結延遲加載是提高應用程序性能并減少其大小的最佳方法之一。在本系列的下一部分中,我將向您展示如何使用和路由來分割應用程序代碼。 當移動優先(mobile-first)的方式逐漸成為一種標準,而不確定的網絡環境因素應該始終是我們考慮的一點,因此保持讓應用程序快速加載變得越來越困難。在本系列文章...
摘要:如果需要防范這種攻擊,請修改構造函數,使其在被要求創建第二個實例時拋出異常。單例模式與單一職責原則有沖突。源碼地址參考文獻設計模式之禪 定義 單例模式是一個比較簡單的模式,其定義如下: 保證一個類僅有一個實例,并提供一個訪問它的全局訪問點。 或者 Ensure a class has only one instance, and provide a global point of ac...
閱讀 2825·2021-11-25 09:43
閱讀 977·2021-10-11 10:57
閱讀 2477·2020-12-03 17:20
閱讀 3716·2019-08-30 14:05
閱讀 2421·2019-08-29 14:00
閱讀 1990·2019-08-29 12:37
閱讀 1660·2019-08-26 11:34
閱讀 3201·2019-08-26 10:27