溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

php的spl_autoload_register()函數(shù)實(shí)例分析

發(fā)布時(shí)間:2022-03-18 16:23:22 來源:億速云 閱讀:300 作者:iii 欄目:大數(shù)據(jù)

本篇內(nèi)容主要講解“php的spl_autoload_register()函數(shù)實(shí)例分析”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“php的spl_autoload_register()函數(shù)實(shí)例分析”吧!

spl_autoload_register()函數(shù)

PHP的SPL庫作為擴(kuò)展庫,已經(jīng)于5.3.0版本后默認(rèn)保持開啟,成為PHP的一組強(qiáng)大的核心擴(kuò)展庫。大家有時(shí)間可以多研究研究SPL里面的方法功能。而且,SPL中包含很多類庫喲,在設(shè)計(jì)模式的系列文章中,我們也會(huì)再次見到他們的身影!

這回我們建立一個(gè)文件,叫做spl_autoload_register.php,然后將下面的代碼復(fù)制進(jìn)去吧:


<?php

spl_autoload_register(function( $className ){
   require $className . '.php';
});

$m = new TestClass();
$m->show();



是不是和__autoload()很像,當(dāng)然作用也很像。我們直接運(yùn)行這個(gè)文件試試,會(huì)發(fā)現(xiàn)TestClass.php也正常的加載了進(jìn)來。那么為啥不直接用__autoload()函數(shù),而使用sql_autoload_register()這么詭異的函數(shù),而且還有個(gè)神奇的閉包參數(shù)?。?!

我們先看看它的定義和格式

PHP官方文檔中的定義

注冊(cè)給定的函數(shù)作為 __autoload 的實(shí)現(xiàn)

沒錯(cuò),那個(gè)匿名函數(shù)就是一個(gè)__autoload()函數(shù),我們可以理解為給當(dāng)前這個(gè)PHP文件中注冊(cè)一個(gè)__autoload()函數(shù),而使用匿名函數(shù)的原因呢?當(dāng)然就是為了閉包特性,最主要的就是能夠帶來延遲加載(懶加載 )的實(shí)現(xiàn)!

另外,spl_autoload_register()函數(shù)不止是僅僅去注冊(cè)一個(gè)__autoload(),它實(shí)現(xiàn)并維護(hù)了一個(gè)__autoload()隊(duì)列。原來在一個(gè)文件中只能有一個(gè)__autoload()方法,但現(xiàn)在,你擁有的是一個(gè)隊(duì)列。

函數(shù)格式

spl_autoload_register ([ callable $autoload_function [, bool $throw = true [, bool $prepend = false ]]] ) : bool

有點(diǎn)長,我們一步步看:

  • callable $autoload_function:閉包函數(shù),不多解釋了,上面已經(jīng)說了,不了解閉包函數(shù)的作用可以百度百度

  • bool $throw:當(dāng)$autoload_function無法成功注冊(cè)時(shí),是否拋出異常

  • bool $prepend:如果是true,將會(huì)添加一個(gè)__autoload()函數(shù)到隊(duì)列的頂部

  • 這個(gè)函數(shù)有返回值,成功或失敗

改造代碼

嗯,到這里好像有點(diǎn)復(fù)雜了,我們需要改造改造代碼這樣才能讓大家看得更清晰,先準(zhǔn)備另一個(gè)需要加載的類文件,就叫CaseClass.php好了

<?php

class CaseClass
{
   public function show()
   {
       echo "Good!\n";
   }
}

然后修改spl_autoload_register.php文件

<?php

// 使用匿名函數(shù)方式
spl_autoload_register(function( $className ){
   echo "first==>\n";
   require_once 'TestClass.php';
});

// 需要注冊(cè)的外部__autoload()實(shí)現(xiàn)
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();

什么都別說了,直接運(yùn)行吧,如果有報(bào)錯(cuò)請(qǐng)檢查下哪里寫錯(cuò)了,反正我這里沒錯(cuò)~~

正常情況下應(yīng)該輸出這樣的內(nèi)容

php的spl_autoload_register()函數(shù)實(shí)例分析

  1. "first==>"是我們?cè)瓉淼膕pl_autoload_register()函數(shù)輸出的內(nèi)容,這里我們沒有使用$className來動(dòng)態(tài)加載,而是只加載TestClass.php這一個(gè)文件

  2. 接下來我們便輸出了TestClass里面的show()方法的內(nèi)容。需要注意的是:這里可還沒有加載CaseClass.php這個(gè)文件哦,也就是現(xiàn)在我們已經(jīng)實(shí)現(xiàn)了懶加載了哦

  3. 接下來,我們想要實(shí)例化CaseClass對(duì)象,于是spl_autoload_register()維護(hù)的隊(duì)列發(fā)揮作用了。先走第一條,利用require_once()對(duì)于之前已經(jīng)加載過的TestClass.php不會(huì)再次加載了。但是這一個(gè)文件中并沒有找到我們需要的CaseClass對(duì)象,于是我們進(jìn)入了隊(duì)列第二條,來到了CaseAutoLoad()方法中,CaseClass.php終于在這個(gè)方法中被require_once()進(jìn)來了

到這里,你已經(jīng)知道了這個(gè)函數(shù)最大的作用就是維護(hù)的這個(gè)隊(duì)列并且可以延遲加載我們需要的文件。是不是感覺有點(diǎn)要走上人生巔峰了?不不不,你心里或許還在疑惑,這玩意跟Composer有啥關(guān)系?

請(qǐng)?jiān)谀枰獪y(cè)試的目錄初始化一個(gè)Composer

  • 進(jìn)入vendor/composer/autoload_real.php中

  • 在getLoader()方法中馬上就能發(fā)現(xiàn)spl_autoload_register()方法

  • 然后在最底下有個(gè)$loader->register(true);方法-- 簡單的閱讀代碼我們發(fā)現(xiàn)其實(shí)這個(gè)$loader就是ClassLoader類

  • 進(jìn)入ClassLoader.php文件中,找到register()方法- 沒錯(cuò),里面還是一個(gè)spl_autoload_register()方法,這樣來看,這貨就是Composer的靈魂啊?。?/p>

到此,相信大家對(duì)“php的spl_autoload_register()函數(shù)實(shí)例分析”有了更深的了解,不妨來實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

php
AI