PHP的Composer工具规范了我们对系统各种资源库的加载格式,借助于PHP的自动加载机制,可以很大程度上简化在应用开发过程中的类库文件引用场景。但到目前为止,它有个不是问题的问题,就是文件后缀名只支持.php,而基于某些框架开发的旧资产,类文件的后缀名是.class.php,想使用Composer的自动加载规范,就不太纯粹了,一般要两者混着用,或者修改其他框架下的加载规则。

有没有省事点的解决办法呢?

首先只要能产生这么一个疑问,就赢了。而答案呢,多半能找到的。

Composer实现自动加载机制的代码非常简练,稍微看一下就能看懂。

当看到ClassLoader.php文件中的findFileWithExtension方法时参数里出现了一个$ext,也就看到希望。只要在适当的时机,能覆盖这个$ext参数就搞定。

其原始代码如下:

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 {

稍微修改一下:

autload_psr4.php 配置文件中,对应的格式变化:

return array(
'Qiniu\\' => array($vendorDir . '/qiniu/php-sdk/src/Qiniu’),
// 字符串格式改为二维数组格式
‘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 {

编码,有一种纯粹的乐趣。

最新文章

  1. PHP正确的使用复数
  2. 使用go的ssh包快速打造一个本地命令行ssh客户端
  3. easyui datagrid plunges 扩展 插件
  4. Spring Cloud介绍 Spring Cloud与Dubbo对比
  5. 学习最短路建图 HUD 5521
  6. SQL 表结构操作
  7. 保证你能看懂的KMP字符串匹配算法
  8. 我的第三篇博客(激动激动真激动!!!)A-B Problem
  9. Python day 05
  10. jQuery Colorbox弹窗插件使用教程小结、属性设置详解以及colorbox关闭
  11. Python使用opencv
  12. EntityFramework中几种操作小结
  13. Java-Excel文件读取
  14. 读写锁--ReentrantReadWriteLock
  15. Powershell About LocalGroupMembership
  16. 三十四 Python分布式爬虫打造搜索引擎Scrapy精讲—scrapy信号详解
  17. 协议类接口 - I2C
  18. Codeforces 914C Travelling Salesman and Special Numbers (数位DP)
  19. Win10 WSL Ubuntu18.04 编译安装MySQL5.7
  20. Android开发之布局文件里实现OnClick事件关联处理方法

热门文章

  1. rhel7 ifconfig command not found
  2. 【转载】linux 测试机器端口连通性方法
  3. office2010激活 错误代码0X8007000D,KMS激活0x8007000D错误解决办法,亲测成功激活
  4. JavaScript面向对象:类、方法、属性
  5. 请教Mysql如何删除 不包含 某些字符的记录
  6. spring+mybatis的插件【shardbatis2.0】+mysql+java自定义注解实现分表
  7. 香蕉派 banana pi BPI-M3 八核开源硬件开发板
  8. DevExpress GridControl List绑定方式下新增行的方法
  9. gf框架之grpool - 高性能的goroutine池
  10. 基于Django的独立运行的python脚本开发