本系列的第二篇文章,這次我們聊聊:spl_autoload_register()函式
PHP的SPL庫作為擴展庫,已經于5.3.0版本后默認保持開啟,成為PHP的一組強大的核心擴展庫,大家有時間可以多研究研究SPL里面的方法功能,而且,SPL中包含很多類別庫喲,在設計模式的系列文章中,我們也會再次見到他們的身影!
這回我們建立一個檔案,叫做spl_autoload_register.php,然后將下面的代碼復制進去吧:
<?php
spl_autoload_register(function( $className ){
require $className . '.php';
});
$m = new TestClass();
$m->show();
是不是和__autoload()很像,當然作用也很像,我們直接運行這個檔案試試,會發現TestClass.php也正常的加載了進來,那么為啥不直接用__autoload()函式,而使用sql_autoload_register()這么詭異的函式,而且還有個神奇的閉包引數!!!
我們先看看它的定義和格式
PHP官方檔案中的定義
注冊給定的函式作為 __autoload 的實作
沒錯,那個匿名函式就是一個__autoload()函式,我們可以理解為給當前這個PHP檔案中注冊一個__autoload()函式,而使用匿名函式的原因呢?當然就是為了閉包特性,最主要的就是能夠帶來延遲加載(懶加載 )的實作!
另外,spl_autoload_register()函式不止是僅僅去注冊一個__autoload(),它實作并維護了一個__autoload()佇列,原來在一個檔案中只能有一個__autoload()方法,但現在,你擁有的是一個佇列,
函式格式
spl_autoload_register ([ callable $autoload_function [, bool $throw = true [, bool $prepend = false ]]] ) : bool
有點長,我們一步步看:
- callable $autoload_function:閉包函式,不多解釋了,上面已經說了,不了解閉包函式的作用可以百度百度
- bool $throw:當$autoload_function無法成功注冊時,是否拋出例外
- bool $prepend:如果是true,將會添加一個__autoload()函式到佇列的頂部
- 這個函式有回傳值,成功或失敗
改造代碼
嗯,到這里好像有點復雜了,我們需要改造改造代碼這樣才能讓大家看得更清晰,先準備另一個需要加載 的類檔案,就叫CaseClass.php好了
<?php
class CaseClass
{
public function show()
{
echo "Good!\n";
}
}
然后修改spl_autoload_register.php檔案
<?php
// 使用匿名函式方式
spl_autoload_register(function( $className ){
echo "first==>\n";
require_once 'TestClass.php';
});
// 需要注冊的外部__autoload()實作
spl_autoload_register('CaseAutoLoad');
function CaseAutoLoad( $className ){
echo "second==>\n";
require_once 'CaseClass.php';
}
$m = new TestClass();
$m->show();
echo "--------\n";
$s = new CaseClass();
$s->show();
什么都別說了,直接運行吧,如果有報錯請檢查下哪里寫錯了,反正我這里沒錯~~
正常情況下應該輸出這樣的內容

- "first==>"是我們原來的spl_autoload_register()函式輸出的內容,這里我們沒有使用$className來動態加載,而是只加載TestClass.php這一個檔案
- 接下來我們便輸出了TestClass里面的show()方法的內容,需要注意的是:這里可還沒有加載CaseClass.php這個檔案哦,也就是現在我們已經實作了懶加載了哦
- 接下來,我們想要實體化CaseClass物件,于是spl_autoload_register()維護的佇列發揮作用了,先走第一條,利用require_once()對于之前已經加載過的TestClass.php不會再次加載了,但是這一個檔案中并沒有找到我們需要的CaseClass物件,于是我們進入了佇列第二條,來到了CaseAutoLoad()方法中,CaseClass.php終于在這個方法中被require_once()進來了
到這里,你已經知道了這個函式最大的作用就是維護的這個佇列并且可以延遲加載我們需要的檔案,是不是感覺有點要走上人生巔峰了?不不不,你心里或許還在疑惑,這玩意跟Composer有啥關系?
請在您需要測驗的目錄初始化一個Composer
- 進入vendor/composer/autoload_real.php中
- 在getLoader()方法中馬上就能發現spl_autoload_register()方法
- 然后在最底下有個$loader->register(true);方法-- 簡單的閱讀代碼我們發現其實這個$loader就是ClassLoader類
- 進入ClassLoader.php檔案中,找到register()方法- 沒錯,里面還是一個spl_autoload_register()方法,這樣來看,這貨就是Composer的靈魂啊!!
OK,走到這里,其實在面試的時候就可以跟面試官司吹牛了,Composer的原理?spl_autoload_register()方法嘛,說不定確實有不少人就被你唬住了,但是,對于Composer來說,我們還有一個非常重要的方面不能忽略,可以將它看作是Composer的血肉,讓自動加載能夠有形,成為一個有靈魂有軀體的完整的人,這就是PSR規范中的PSR0和PSR4規范,下篇我們就聊聊這倆貨!
完整原始碼:GitHub
===============
關注公眾號:【硬核專案經理】獲取最新文章
添加微信/QQ好友:【xiaoyuezigonggong/149844827】免費得PHP、專案管理學習資料
知乎、公眾號、抖音、頭條搜索【硬核專案經理】
B站ID:482780532
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/231304.html
標籤:PHP
上一篇:Java之JDK環境變數配置全套圖文詳解(含Windows7、Windows10)
下一篇:[PHP] 判斷兩個陣列是否相同
