PHP的Composer工具規範了咱們對系統各類資源庫的加載格式,藉助於PHP的自動加載機制,能夠很大程度上簡化在應用開發過程當中的類庫文件引用場景。但到目前爲止,它有個不是問題的問題,就是文件後綴名只支持.php,而基於某些框架開發的舊資產,類文件的後綴名是.class.php,想使用Composer的自動加載規範,就不太純粹了,通常要二者混着用,或者修改其餘框架下的加載規則。php
有沒有省事點的解決辦法呢?數組
首先只要能產生這麼一個疑問,就贏了。而答案呢,多半能找到的。框架
Composer實現自動加載機制的代碼很是簡練,稍微看一下就能看懂。工具
當看到ClassLoader.php文件中的findFileWithExtension方法時參數裏出現了一個$ext,也就看到但願。只要在適當的時機,能覆蓋這個$ext參數就搞定。this
其原始代碼以下:編碼
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 {
稍微修改一下:spa
autload_psr4.php 配置文件中,對應的格式變化:code
return array( 'Qiniu\\' => array($vendorDir . '/qiniu/php-sdk/src/Qiniu’), // 字符串格式改成二維數組格式 ‘Liniu\\' => array([$vendorDir . ‘/Liniu/php-sdk/src/Liniu’, ‘.class.php']), );
貼出代碼:blog
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 {
編碼,有一種純粹的樂趣。資源