在php中,想要例項化乙個類,必須先在例項化之前載入類:
require
..../class1.php 或者 include ...
./class1.php
require
..../class2.php 或者 include ...
./class2.php
$try
=new class1;
$try1
=new class2;
這樣的做法使即時不會馬上用到的類都要一次性全部載入,導致效率下降
php5以後,引入函式spl_autoload_register(),現在大多數框架都有使用,使用spl_autoload_register之前需要先設定乙個自動裝載函式,規定了引數與實際類路徑的關係及載入方式。
function autoload($class)
然後將這個函式註冊到spl函式中
spl_autoload_register(「autoload」);
這樣,當例項化乙個未載入的類時,會觸發spl_autoload_register函式,進而觸發autoload函式,將class載入,這就是所謂的類延遲載入。
yii2中是如何使用自動載入的?這個先定位到入口檔案的index.php中:
// comment out the following two lines when deployed to production
defined('yii_debug') or
define
('yii_debug', true);
defined('yii_env') or
define
('yii_env', 'dev');
require(__dir__ .
'/../vendor/autoload.php');
require(__dir__ .
'/../vendor/yiisoft/yii2/yii.php');
$config
=require(__dir__ .
'/../config/web.php');
autoload.php是第三方的類載入,只要保證yii.php在最後面,就可以確保其可以將自己的autoloader插入到整個autoloder 棧的最前面,從而在需要時最先被呼叫。
再來看看yii.php的
class yii extends \yii\baseyii
spl_autoload_register([『yii』, 『autoload』], true, true);
yii::$classmap = require(dir. 『/classes.php』);
yii::$container = new yii\di\container();
註冊的是baseyii.php中的autoload函式,然後yii將 calsses.php 這個檔案作為乙個對映表儲存到 yii::$classmap 當中。這個對映表,儲存了一系列的類名與其所在php檔案的對映關係。
最後看一下auto函式的奧秘:
public這個函式的大意就是看引數如果是乙個字串,就搜尋看看有沒有這個別名,找到對應路徑,如果引數是乙個路徑,就直接找到路徑,否則就報錯!static
function
autoload
($classname)
} elseif (strpos($classname, '\\') !== false)
} else
include($classfile);
if (yii_debug && !class_exists($classname, false) && !inte***ce_exists($classname, false) && !trait_exists($classname, false))
}
懶載入 延遲載入
概念 為了推遲和資料庫互動的時間,推遲到真正需要這個物件資料的時候。提高系統的效能 通過 asm和cglib二個jar包實現懶載入。domain是非final的 1 session.load懶載入 1 返回的是乙個 物件,new關鍵字來建立乙個 物件,理解成乙個快捷方式,不是真正的類,而是 類。2 ...
同步載入 非同步載入 延遲載入
一 同步載入 平常預設用的都是同步載入。如 同步模式又稱阻塞模式,會阻止瀏覽器的後續處理,停止了後續的檔案的解析,執行,如影象的渲染。流覽器之所以會採用同步模式,是因為載入的js檔案中有對dom的操作,重定向,輸出document等預設行為,所以同步才是最安全的。通常會把要載入的js放到body結束...
延遲載入D L L
延遲載入d l l amoon100 2005 10 16 microsoft visual c 6.0提供了乙個出色的新特性,它能夠使dll的操作變得更加容易。這個特性稱為延遲載入dll。延遲載入的dll是個隱含鏈結的dll,它實際上要等到你的 試圖引用dll中包含的乙個符號時才進行載入。延遲載入...