摘要:當(dāng)然,實(shí)際當(dāng)中,我們更可能會(huì)這么來(lái)使用也即是做了一定的文件名大小寫(xiě)處理,然后在之前檢查文件是否存在,不存在的話(huà)顯示自定義的信息。
本文來(lái)自pilishen.com----原文鏈接; 歡迎作客我們的php&Laravel學(xué)習(xí)群:109256050該篇屬于《Laravel底層核心技術(shù)實(shí)戰(zhàn)揭秘》這一課程《laravel底層核心概念解析》這一章的擴(kuò)展閱讀。由于要真正學(xué)好laravel底層,有些PHP相關(guān)的知識(shí)必須得了解,考慮到學(xué)員們的基礎(chǔ)差異,為了避免視頻當(dāng)中過(guò)于詳細(xì)而連篇累牘,故將一些laravel底層實(shí)現(xiàn)相關(guān)的PHP知識(shí)點(diǎn)以文章形式呈現(xiàn),供大家預(yù)習(xí)和隨時(shí)查閱。
傳統(tǒng)上,在PHP里,當(dāng)我們要用到一個(gè)class文件的時(shí)候,我們都得在文檔頭部require或者include一下:
但是一旦要調(diào)用的文檔多了,就得每次都寫(xiě)一行,瞅著也不美觀(guān),有什么辦法能讓PHP文檔自動(dòng)加載呢?
對(duì),可以使用PHP的魔法函數(shù)__autoload(),上面的示例就是自動(dòng)加載當(dāng)前目錄下的PHP文件。當(dāng)然,實(shí)際當(dāng)中,我們更可能會(huì)這么來(lái)使用:
也即是做了一定的文件名大小寫(xiě)處理,然后在require之前檢查文件是否存在,不存在的話(huà)顯示自定義的信息。
類(lèi)似用法經(jīng)常在私人項(xiàng)目,或者說(shuō)是單一項(xiàng)目的框架中見(jiàn)到,為什么呢?因?yàn)槟阒荒芏x一個(gè)__autoload function,在多人開(kāi)發(fā)中,做不到不同的developer使用不同的自定義的autoloader,除非大家都提前說(shuō)好了,都使用一個(gè)__autoload,涉及到改動(dòng)了就進(jìn)行版本同步,這很麻煩。
也主要是因?yàn)榇?,有個(gè)好消息,就是這個(gè)__autoload函數(shù)馬上要在7.2版本的PHP中棄用了。
Warning This feature has been DEPRECATED as of PHP 7.2.0. Relying on this feature is highly discouraged.那么取而代之的是一個(gè)叫spl_autoload_register()的東東,它的好處是可以自定義多個(gè)autoloader.
//使用匿名函數(shù)來(lái)autoload spl_autoload_register(function($class_name){ require_once("..."); });//使用一個(gè)全局函數(shù) function Custom() { require_once("..."); } spl_autoload_register("Custom");//使用一個(gè)class當(dāng)中的static方法 class MyCustomAutoloader { static public function myLoader($class_name) { require_once("..."); } } //傳array進(jìn)來(lái),第一個(gè)是class名,第二個(gè)是方法名 spl_autoload_register(["MyCustomAutoloader","myLoader"]);//甚至也可以用在實(shí)例化的object上 class MyCustomAutoloader { public function myLoader($class_name) { } } $object = new MyCustomAutoloader; spl_autoload_register([$object,"myLoader"]);值得一提的是,使用autoload,無(wú)論是__autoload(),還是spl_autoload_register(),相比于require或include,好處就是autoload機(jī)制是lazy loading,也即是并不是你一運(yùn)行就給你調(diào)用所有的那些文件,而是只有你用到了哪個(gè),比如說(shuō)new了哪個(gè)文件以后,才會(huì)通過(guò)autoload機(jī)制去加載相應(yīng)文件。
當(dāng)然,laravel包括各個(gè)package里也是經(jīng)常用到spl_autoload_register,比如這里:
/** * Prepend the load method to the auto-loader stack. * * @return void */ protected function prependToLoaderStack() { spl_autoload_register([$this, "load"], true, true); }感興趣的童鞋可以使用spl_autoload_functions()來(lái)查看一個(gè)系統(tǒng)中注冊(cè)了多少個(gè)autoloader,你可以在laravel中調(diào)用看一下~
更詳細(xì)的我們會(huì)在《Laravel底層核心技術(shù)實(shí)戰(zhàn)揭秘》里闡述。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/28211.html
摘要:但現(xiàn)在問(wèn)題來(lái)了,如果在一個(gè)系統(tǒng)的實(shí)現(xiàn)中,如果需要使用很多其它的類(lèi)庫(kù),這些類(lèi)庫(kù)可能是由不同的開(kāi)發(fā)人員編寫(xiě)的,其類(lèi)名與實(shí)際的磁盤(pán)文件的映射規(guī)則不盡相同。 PHP在魔術(shù)函數(shù)__autoload()方法出現(xiàn)以前,如果你要在一個(gè)程序文件中實(shí)例化100個(gè)對(duì)象,那么你必須用include或者require包含進(jìn)來(lái)100個(gè)類(lèi)文件,或者你把這100個(gè)類(lèi)定義在同一個(gè)類(lèi)文件中——相信這個(gè)文件一定會(huì)非常大。但...
摘要:自動(dòng)加載是指在代碼中,不需要顯式地使用文件路徑將類(lèi)庫(kù)文件包含進(jìn)來(lái),便可使用該文件中定義的類(lèi)庫(kù)。在里是這樣進(jìn)行配置的按照的規(guī)則,當(dāng)試圖自動(dòng)加載這個(gè)時(shí),會(huì)去尋找這個(gè)文件。最后,只要在項(xiàng)目中你所需要的所有類(lèi)庫(kù)都會(huì)在適當(dāng)?shù)臅r(shí)候自動(dòng)載入。 Composer是PHP中用來(lái)管理依賴(lài)(dependency)關(guān)系的工具。你可以在自己的項(xiàng)目中聲明所依賴(lài)的外部工具庫(kù)(libraries),Composer...
摘要:中是如何實(shí)現(xiàn)代碼的自動(dòng)加載的入口腳本的以下兩行代碼其中的作用注冊(cè)為自動(dòng)加載函數(shù)。這個(gè)負(fù)責(zé)引入了一個(gè)類(lèi)中的,隨后立即解除注冊(cè)。注冊(cè)中的為自動(dòng)加載函數(shù),并利用配置文件即目錄下的文件對(duì)這個(gè)自動(dòng)加載函數(shù)進(jìn)行了初始化。 1.基本知識(shí) Include與require 的作用: 當(dāng)一個(gè)文件被包含時(shí),其中所包含的代碼繼承了 include 所在行的變量范圍。從該處開(kāi)始,調(diào)用文件在該行處可用的任何...
摘要:任務(wù)是加載類(lèi)的初始化頂級(jí)命名空間與文件路徑映射初始化和注冊(cè)。在實(shí)際情況下可能會(huì)出現(xiàn)這樣的情況。值得注意的是這個(gè)函數(shù)返回的是一個(gè)匿名函數(shù),為什么呢原因就是類(lèi)中的等等都是的。。。關(guān)于匿名函數(shù)的綁定功能。 前言 在開(kāi)始之前,歡迎關(guān)注我自己的博客:www.leoyang90.cn 上一篇文章,我們討論了 PHP 的自動(dòng)加載原理、PHP 的命名空間、PHP 的 PSR0 與 PSR4 標(biāo)準(zhǔn),有...
摘要:今天來(lái)寫(xiě)寫(xiě)這個(gè)框架的類(lèi)加載機(jī)制版本原理在項(xiàng)目啟動(dòng)時(shí),通過(guò)注冊(cè)了要使用的類(lèi)的自動(dòng)加載處理方法,在類(lèi)第一次被使用的時(shí)候,類(lèi)文件通過(guò)該方法被引入,然后類(lèi)才得以使用源碼分析在的入口文件,我們找到我們隨著這個(gè)路徑我們找打了這個(gè)主要內(nèi)容如下其中是為了注 今天來(lái)寫(xiě)寫(xiě)Symfony2.8 這個(gè)框架的類(lèi)加載機(jī)制 版本 Symfony 2.8 原理 在項(xiàng)目啟動(dòng)時(shí),Symfony 通過(guò)spl_autoloa...
摘要:前言在開(kāi)始之前,歡迎關(guān)注我自己的博客這篇文章是對(duì)自動(dòng)加載功能的一個(gè)總結(jié),內(nèi)容涉及的自動(dòng)加載功能的命名空間的與標(biāo)準(zhǔn)等內(nèi)容。要實(shí)現(xiàn)第一步,第二步的功能,必須在開(kāi)發(fā)時(shí)約定類(lèi)名與磁盤(pán)文件的映射方法,只有這樣我們才能根據(jù)類(lèi)名找到它對(duì)應(yīng)的磁盤(pán)文件。 前言 在開(kāi)始之前,歡迎關(guān)注我自己的博客:www.leoyang90.cn 這篇文章是對(duì)PHP自動(dòng)加載功能的一個(gè)總結(jié),內(nèi)容涉及PHP的自動(dòng)加載功能、P...
閱讀 3107·2021-02-22 17:12
閱讀 728·2019-08-30 15:55
閱讀 3106·2019-08-30 15:54
閱讀 1398·2019-08-29 16:56
閱讀 1869·2019-08-29 15:13
閱讀 1730·2019-08-29 13:19
閱讀 610·2019-08-26 13:40
閱讀 2829·2019-08-26 10:26