摘要:自動(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)載入。
PHP的自動(dòng)加載機(jī)制Composer是PHP中用來(lái)管理依賴(lài)(dependency)關(guān)系的工具。你可以在自己的項(xiàng)目中聲明所依賴(lài)的外部工具庫(kù)(libraries),Composer會(huì)幫你安裝這些依賴(lài)的庫(kù)文件。
自動(dòng)加載是指在代碼中,不需要顯式地使用文件路徑將類(lèi)庫(kù)文件包含進(jìn)來(lái),便可使用該文件中定義的類(lèi)庫(kù)。
PHP的自動(dòng)加載可以使用__autoload()和spl_autoload_register()兩種機(jī)制,但后一種為主流,原因是:
__autoload()是全局唯一的,如果框架占了這個(gè)名字,便會(huì)導(dǎo)致框架的用戶(hù)用不了其它的__autoload()了,包括用戶(hù)自定義的和其它類(lèi)庫(kù)帶的。spl_autoload_register()可以注冊(cè)多個(gè)autoload方法,不存在這個(gè)問(wèn)題。
__autoload()是一個(gè)函數(shù),在實(shí)際使用中,開(kāi)發(fā)者勢(shì)必要賦予它一些變量(例如class path和class_name => file_path mapping數(shù)組)。這就只能靠全局變量了,使用全局變量可不是好的編碼習(xí)慣。spl_autoload_register()可以將一個(gè)Class的某個(gè)方法注冊(cè)為autoload函數(shù),如Symfony的spl_autoload_register(array(self::getInstance(), "autoload"));
Composer的自動(dòng)加載方式Composer提供了四種自動(dòng)加載的方式,分別是PSR-0、PSR-4、生成classmap以及直接包含files。
提到psr-0和psr-4就不得不先了解命名空間,命名空間的詳細(xì)介紹詳見(jiàn)底部《PHP手冊(cè):命名空間》[[1]](#php-namespace)。
psr-0方式,要求目錄名稱(chēng)和命名空間層層對(duì)應(yīng),會(huì)導(dǎo)致目錄結(jié)構(gòu)容易變得比較深。雖然已被官方廢棄,但因?yàn)橹髁骺蚣芏家褜?shí)現(xiàn)psr-0,因此composer仍然使用psr-0來(lái)向下兼容。
"autoload": { "psr-0": { "Foo": "src/", } }
按照PSR-0的規(guī)則,當(dāng)試圖自動(dòng)加載 "FooBarBaz" 這個(gè)class時(shí),那么會(huì)去尋找"src/Foo/Bar/Baz.php",最終這個(gè)配置也以Map的形式寫(xiě)入生成的vendor/composer/autoload_namespaces.php
psr-4方式,是composer推薦使用的一種方式,也是psr-0的替代方案,因?yàn)樗资褂貌⒛軒?lái)更簡(jiǎn)潔的目錄結(jié)構(gòu)。在composer.json里是這樣進(jìn)行配置的
"autoload": { "psr-4": { "Foo": "src/", } }
按照PSR-4的規(guī)則,當(dāng)試圖自動(dòng)加載 "FooBarBaz" 這個(gè)class時(shí),會(huì)去尋找 "src/Bar/Baz.php" 這個(gè)文件。psr-4的配置換會(huì)被轉(zhuǎn)換成namespace為key,dir path為value的Map的形式,并寫(xiě)入生成的 vendor/composer/autoload_psr4.php 文件之中
另外注意PSR-4和PSR-0的配置里,"Foo"結(jié)尾的命名空間分隔符必須加上并且進(jìn)行轉(zhuǎn)義,以防出現(xiàn)"Foo"匹配到了"FooBar"這樣的意外發(fā)生。
classmap方式,則是通過(guò)配置指定的目錄或文件,然后在Composer安裝或更新時(shí),它會(huì)掃描指定目錄下以.php或.inc結(jié)尾的文件中的class,生成class到指定file path的映射,并加入新生成的 vendor/composer/autoload_classmap.php 文件中。
"autoload": { "classmap": ["src/", "lib/", "Something.php"] }
例如src/下有一個(gè)BaseController類(lèi),那么在autoload_classmap.php文件中,就會(huì)生成這樣的配置:
"BaseController" => $baseDir . "/src/BaseController.php"
files方式,就是手動(dòng)指定供直接加載的文件。比如說(shuō)我們有一系列全局的helper functions,可以放到一個(gè)helper文件里然后直接進(jìn)行加載
"autoload": { "files": ["src/MyLibrary/functions.php"] }
它會(huì)生成一個(gè)array,包含這些配置中指定的files,再寫(xiě)入新生成的
vendor/composer/autoload_files.php
在composer.json配置完成之后,來(lái)到terminal執(zhí)行
composer install
執(zhí)行成功之后,composer就會(huì)幫你將加載機(jī)制創(chuàng)建完備,會(huì)得到一個(gè)vendor文件夾。
最后,只要在項(xiàng)目中
require "vendor/autoload.php";
你所需要的所有類(lèi)庫(kù)都會(huì)在適當(dāng)?shù)臅r(shí)候自動(dòng)載入。
《PHP手冊(cè):命名空間》http://php.net/language.names...
《PHP手冊(cè):自動(dòng)加載類(lèi)》http://php.net/manual/zh/lang...
《細(xì)說(shuō)“PHP類(lèi)庫(kù)自動(dòng)加載”》https://github.com/qinjx/adv_...
《composer設(shè)計(jì)原理及用法》http://blog.turn.tw/?p=1039
《composer進(jìn)階原理:PHP命名空間與PSR-0》http://blog.turn.tw/?p=1122
《PHP管理依賴(lài)關(guān)系工具Composer的自動(dòng)加載》http://www.jb51.net/article/5...
原文鏈接:https://macken.me/article/composer-autoload
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/21879.html
摘要:接觸過(guò)的同學(xué)都知道使用作為項(xiàng)目的包管理工具但是并不是獨(dú)有的是的包管理工具這兩者的關(guān)系就像于于一樣但是發(fā)現(xiàn)真正項(xiàng)目中使用還是比較少的所以這里這里寫(xiě)一遍文章介紹的使用幫助那些對(duì)于還是有點(diǎn)模糊的同學(xué)此文跟沒(méi)有任何聯(lián)系安裝的方式就不講了具體安裝方式 接觸過(guò)Laravel的同學(xué)都知道,Laravel使用Composer作為項(xiàng)目的包管理工具.但是Composer并不是Laravel獨(dú)有的,Comp...
摘要:中文網(wǎng)系統(tǒng)要求運(yùn)行需要以上版本。注中的路徑為相對(duì)于的路徑這個(gè)時(shí)候,你就可以調(diào)用你自己編寫(xiě)的函數(shù)庫(kù)或者類(lèi)庫(kù)了注本文內(nèi)容參考了中文網(wǎng),后續(xù)還會(huì)更新其它的實(shí)用功能 1.簡(jiǎn)介 Composer 是 PHP 的一個(gè)依賴(lài)管理工具。它允許你申明項(xiàng)目所依賴(lài)的代碼庫(kù),它會(huì)在你的項(xiàng)目中為你安裝他們?!禖omposer 中文網(wǎng)》 2.系統(tǒng)要求 運(yùn)行 Composer 需要 PHP 5.3.2+ 以上版本。C...
摘要:源碼分析自動(dòng)加載系統(tǒng)會(huì)調(diào)用方法注冊(cè)自動(dòng)加載,在這一步完成后,所有符合規(guī)范的類(lèi)庫(kù)包括依賴(lài)加載的第三方類(lèi)庫(kù)都將自動(dòng)加載。是通過(guò)加載對(duì)應(yīng)的文件進(jìn)行注冊(cè)加載的。 源碼分析 自動(dòng)加載 系統(tǒng)會(huì)調(diào)用 Loader::register()方法注冊(cè)自動(dòng)加載,在這一步完成后,所有符合規(guī)范的類(lèi)庫(kù)(包括Composer依賴(lài)加載的第三方類(lèi)庫(kù))都將自動(dòng)加載。 系統(tǒng)的自動(dòng)加載由下面主要部分組成: 1. 注冊(cè)系統(tǒng)的自...
摘要:首先支持下黃老師的視頻網(wǎng)站轉(zhuǎn)型這篇的學(xué)習(xí)筆記也是根據(jù)他的視頻教程寫(xiě)的,一共十集,講解的很簡(jiǎn)單感興趣的同志們可以上他視頻網(wǎng)站購(gòu)買(mǎi)視頻,網(wǎng)站地址放在文末我的博客作用自動(dòng)安裝所需要的模塊,自動(dòng)加載管理項(xiàng)目,發(fā)布到網(wǎng)上上去是默認(rèn)的加載組件地址安裝下 首先支持下黃老師的視頻網(wǎng)站轉(zhuǎn)型這篇composer的學(xué)習(xí)筆記也是根據(jù)他的視頻教程寫(xiě)的,一共十集,講解的很簡(jiǎn)單感興趣的同志們可以上他視頻網(wǎng)站購(gòu)買(mǎi)視頻...
閱讀 3992·2021-11-22 15:31
閱讀 2525·2021-11-18 13:20
閱讀 3115·2021-11-15 11:37
閱讀 7043·2021-09-22 15:59
閱讀 747·2021-09-13 10:27
閱讀 3783·2021-09-09 09:33
閱讀 1448·2019-08-30 15:53
閱讀 2570·2019-08-29 15:37