PHP中類的自動加載

在以前,咱們已經學習過Composer自動加載的原理,其實就是利用了PHP中的類自動加載的特性。在文末有該系列文章的連接。php

PHP中類的自動加載主要依靠的是__autoload()和spl_autoload_register()這兩個方法。今天咱們就來簡單的看一下這兩個方法的使用。git

__autoload()

作爲一個已經快要被淘汰的魔術方法,咱們只須要了解便可。若是在PHP7中使用這個方法的話,會報出過期的警告,系統會建議咱們使用spl_autoload_register()方法。github

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

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

當咱們實例化AutoA類時,當前的文件並無這個類,也沒有從其餘文件中include或者require,這時,就會自動進入魔術方法__autoload()中。咱們在__autoload()方法中只須要去include這個類所在的文件便可。微信

spl_autoload_register()

這個方法目前已經替代了上述魔術方法自動加載類的功能。它是spl擴展庫中的一個方法,spl擴展庫如今已經默認集成在了PHP中,你們能夠放心地直接使用。composer

spl_autoload_register()相對於__autoload()的好處是它能夠去註冊一個__autoload(),而且實現並維護了一個__autoload()隊列。原來在一個文件中只能有一個__autoload()方法,但如今,你擁有的是一個隊列。框架

這樣,你就不須要將全部加載代碼都寫在一個__autoload()方法中,而是可使用多個spl_autoload_register()去單獨進行每一個類的加載處理。oop

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

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

參考:深刻學習Composer原理(二)學習

使用include仍是include_once

在自動加載中,咱們只須要使用include就能夠了,類並不會重複加載。測試

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在屢次實例化類的狀況下只被輸出了一次。因此並不須要關心會有類文件重複加載的問題。並且在大型框架中使用composer的時候會加載很是多的類,_once方法也會帶來效率的問題。ui

總結

此次的文章只是對類自動加載進行了簡單的介紹,想深刻了解這方面知識的能夠移步以前寫過的Composer系列文章:

測試代碼: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.php.net/manual/zh/language.oop5.autoload.php

關注公衆號:【硬核項目經理】獲取最新文章

添加微信/QQ好友:【xiaoyuezigonggong/149844827】免費得PHP、項目管理學習資料

知乎、公衆號、抖音、頭條搜索【硬核項目經理】

B站ID:482780532

相關文章
相關標籤/搜索