如何讓Composer的autoload支持自定義文件后綴名

下面由composer使用教程欄目為大家介紹讓composer的autoload支持自定義文件后綴名的方法,希望對(duì)需要的朋友有所幫助!

如何讓Composer的autoload支持自定義文件后綴名

PHP的Composer工具規(guī)范了我們對(duì)系統(tǒng)各種資源庫(kù)的加載格式,借助于PHP的自動(dòng)加載機(jī)制,可以很大程度上簡(jiǎn)化在應(yīng)用開發(fā)過程中的類庫(kù)文件引用場(chǎng)景。但到目前為止,它有個(gè)不是問題的問題,就是文件后綴名只支持.php,而基于某些框架開發(fā)的舊資產(chǎn),類文件的后綴名是.class.php,想使用Composer的自動(dòng)加載規(guī)范,就不太純粹了,一般要兩者混著用,或者修改其他框架下的加載規(guī)則。

有沒有省事點(diǎn)的解決辦法呢?

首先只要能產(chǎn)生這么一個(gè)疑問,就贏了。而答案呢,多半能找到的。

Composer實(shí)現(xiàn)自動(dòng)加載機(jī)制的代碼非常簡(jiǎn)練,稍微看一下就能看懂。

當(dāng)看到ClassLoader.php文件中的findFileWithExtension方法時(shí)參數(shù)里出現(xiàn)了一個(gè)$ext,也就看到希望。只要在適當(dāng)?shù)臅r(shí)機(jī),能覆蓋這個(gè)$ext參數(shù)就搞定。

其原始代碼如下:

private?function?findFileWithExtension($class,?$ext) ????{ ????????//?PSR-4?lookup ????????$logicalPathPsr4?=?strtr($class,?'',?DIRECTORY_SEPARATOR)?.?$ext; ????????$first?=?$class[0]; ????????if?(isset($this->prefixLengthsPsr4[$first]))?{ ????????????foreach?($this->prefixLengthsPsr4[$first]?as?$prefix?=>?$length)?{ ????????????????if?(0?===?strpos($class,?$prefix))?{ ????????????????????foreach?($this->prefixDirsPsr4[$prefix]?as?$dir)?{ ????????????????????????if?(file_exists($file?=?$dir?.?DIRECTORY_SEPARATOR?.?substr($logicalPathPsr4,?$length)))?{ ????????????????????????????return?$file; ????????????????????????} ????????????????????} ????????????????} ????????????} ????????} ????????//?PSR-4?fallback?dirs ????????foreach?($this->fallbackDirsPsr4?as?$dir)?{ ????????????if?(file_exists($file?=?$dir?.?DIRECTORY_SEPARATOR?.?$logicalPathPsr4))?{ ????????????????return?$file; ????????????} ????????} ????????//?PSR-0?lookup ????????if?(false?!==?$pos?=?strrpos($class,?''))?{ ????????????//?namespaced?class?name ????????????$logicalPathPsr0?=?substr($logicalPathPsr4,?0,?$pos?+?1) ????????????????.?strtr(substr($logicalPathPsr4,?$pos?+?1),?'_',?DIRECTORY_SEPARATOR); ????????}?else?{

稍微修改一下:

如何讓Composer的autoload支持自定義文件后綴名

autload_psr4.php 配置文件中,對(duì)應(yīng)的格式變化:

return?array( ????'Qiniu'?=>?array($vendorDir?.?'/qiniu/php-sdk/src/Qiniu’), ????//?字符串格式改為二維數(shù)組格式 ????‘Liniu'?=>?array([$vendorDir?.?‘/Liniu/php-sdk/src/Liniu’,?‘.class.php']), );

貼出代碼:

private?function?findFileWithExtension($class,?$ext) ????{ ????????//?PSR-4?lookup ????????$logicalPathPsr4?=?strtr($class,?'',?DIRECTORY_SEPARATOR); ????????$first?=?$class[0]; ????????if?(isset($this->prefixLengthsPsr4[$first]))?{ ????????????foreach?($this->prefixLengthsPsr4[$first]?as?$prefix?=>?$length)?{ ????????????????if?(0?===?strpos($class,?$prefix))?{ ????????????????????foreach?($this->prefixDirsPsr4[$prefix]?as?$dir)?{ ????????????????????????$_ext?=?$ext; ????????????????????????$_dir?=?$dir; ????????????????????????if?(is_array($dir)?&&?count($dir)?==?2)?{ ????????????????????????????$_ext?=?$dir[1]; ????????????????????????????$_dir?=?$dir[0]; ????????????????????????} ????????????????????????if?(file_exists($file?=?$_dir?.?DIRECTORY_SEPARATOR?.?substr($logicalPathPsr4?.?$_ext,?$length)))?{ ????????????????????????????return?$file; ????????????????????????} ????????????????????} ????????????????} ????????????} ????????} ????????//?PSR-4?fallback?dirs ????????foreach?($this->fallbackDirsPsr4?as?$dir)?{ ????????????if?(file_exists($file?=?$dir?.?DIRECTORY_SEPARATOR?.?$logicalPathPsr4?.?$ext))?{ ????????????????return?$file; ????????????} ????????} ????????//?PSR-0?lookup ????????if?(false?!==?$pos?=?strrpos($class,?''))?{ ????????????//?namespaced?class?name ????????????$logicalPathPsr0?=?substr($logicalPathPsr4?.?$ext,?0,?$pos?+?1) ????????????????.?strtr(substr($logicalPathPsr4?.?$ext,?$pos?+?1),?'_',?DIRECTORY_SEPARATOR); ????????}?else?{

編碼,有一種純粹的樂趣。

? 版權(quán)聲明
THE END
喜歡就支持一下吧
點(diǎn)贊8 分享