小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

PHP中類(lèi)的自動(dòng)加載

 硬核項(xiàng)目經(jīng)理 2021-05-31

PHP中類(lèi)的自動(dòng)加載

在之前,我們已經(jīng)學(xué)習(xí)過(guò)Composer自動(dòng)加載的原理,其實(shí)就是利用了PHP中的類(lèi)自動(dòng)加載的特性。在文末有該系列文章的鏈接。

PHP中類(lèi)的自動(dòng)加載主要依靠的是__autoload()和spl_autoload_register()這兩個(gè)方法。今天我們就來(lái)簡(jiǎn)單的看一下這兩個(gè)方法的使用。

__autoload()

做為一個(gè)已經(jīng)快要被淘汰的魔術(shù)方法,我們只需要了解即可。如果在PHP7中使用這個(gè)方法的話(huà),會(huì)報(bào)出過(guò)時(shí)的警告,系統(tǒng)會(huì)建議我們使用spl_autoload_register()方法。

function __autoload($name){
include __DIR__ . '/autoload/' . $name . '.class.php';
}

$autoA = new AutoA();
var_dump($autoA);

當(dāng)我們實(shí)例化AutoA類(lèi)時(shí),當(dāng)前的文件并沒(méi)有這個(gè)類(lèi),也沒(méi)有從其他文件中include或者require,這時(shí),就會(huì)自動(dòng)進(jìn)入魔術(shù)方法__autoload()中。我們?cè)赺_autoload()方法中只需要去include這個(gè)類(lèi)所在的文件即可。

spl_autoload_register()

這個(gè)方法目前已經(jīng)替代了上述魔術(shù)方法自動(dòng)加載類(lèi)的功能。它是spl擴(kuò)展庫(kù)中的一個(gè)方法,spl擴(kuò)展庫(kù)現(xiàn)在已經(jīng)默認(rèn)集成在了PHP中,大家可以放心地直接使用。

spl_autoload_register()相對(duì)于__autoload()的好處是它可以去注冊(cè)一個(gè)__autoload(),并且實(shí)現(xiàn)并維護(hù)了一個(gè)__autoload()隊(duì)列。原來(lái)在一個(gè)文件中只能有一個(gè)__autoload()方法,但現(xiàn)在,你擁有的是一個(gè)隊(duì)列。

這樣,你就不需要將所有加載代碼都寫(xiě)在一個(gè)__autoload()方法中,而是可以使用多個(gè)spl_autoload_register()去單獨(dú)進(jìn)行每個(gè)類(lèi)的加載處理。

spl_autoload_register(function($name){
include __DIR__ . '/autoload/' . $name . '.class.php';
});

$autoA = new AutoA();
var_dump($autoA);

參考:深入學(xué)習(xí)Composer原理(二)

使用include還是include_once

在自動(dòng)加載中,我們只需要使用include就可以了,類(lèi)并不會(huì)重復(fù)加載。

spl_autoload_register(function($name){
include __DIR__ . '/autoload/' . $name . '.class.php';
echo $name, PHP_EOL;
});

$autoA = new AutoA();
var_dump($autoA);

$autoA = new AutoA();
var_dump($autoA);

$autoA = new AutoA();
var_dump($autoA);

$autoB = new AutoB();
var_dump($autoB);

從代碼中,我們可以看出$name在多次實(shí)例化類(lèi)的情況下只被輸出了一次。所以并不需要關(guān)心會(huì)有類(lèi)文件重復(fù)加載的問(wèn)題。而且在大型框架中使用composer的時(shí)候會(huì)加載非常多的類(lèi),_once方法也會(huì)帶來(lái)效率的問(wèn)題。

總結(jié)

這次的文章只是對(duì)類(lèi)自動(dòng)加載進(jìn)行了簡(jiǎn)單的介紹,想深入了解這方面知識(shí)的可以移步之前寫(xiě)過(guò)的Composer系列文章:

測(cè)試代碼:https://github.com/zhangyue0503/dev-blog/blob/master/php/201912/source/PHP%E4%B8%AD%E7%B1%BB%E7%9A%84%E8%87%AA%E5%8A%A8%E5%8A%A0%E8%BD%BD.php

參考文檔:https://www./manual/zh/language.oop5.autoload.php

    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶(hù) 評(píng)論公約

    類(lèi)似文章 更多