如何让Composer的autoload支持自定义文件后缀名
2024-10-13 18:29:05
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 {
编码,有一种纯粹的乐趣。
最新文章
- PHP正确的使用复数
- 使用go的ssh包快速打造一个本地命令行ssh客户端
- easyui datagrid plunges 扩展 插件
- Spring Cloud介绍 Spring Cloud与Dubbo对比
- 学习最短路建图 HUD 5521
- SQL 表结构操作
- 保证你能看懂的KMP字符串匹配算法
- 我的第三篇博客(激动激动真激动!!!)A-B Problem
- Python day 05
- jQuery Colorbox弹窗插件使用教程小结、属性设置详解以及colorbox关闭
- Python使用opencv
- EntityFramework中几种操作小结
- Java-Excel文件读取
- 读写锁--ReentrantReadWriteLock
- Powershell About LocalGroupMembership
- 三十四 Python分布式爬虫打造搜索引擎Scrapy精讲—scrapy信号详解
- 协议类接口 - I2C
- Codeforces 914C Travelling Salesman and Special Numbers (数位DP)
- Win10 WSL Ubuntu18.04 编译安装MySQL5.7
- Android开发之布局文件里实现OnClick事件关联处理方法
热门文章
- rhel7 ifconfig command not found
- 【转载】linux 测试机器端口连通性方法
- office2010激活 错误代码0X8007000D,KMS激活0x8007000D错误解决办法,亲测成功激活
- JavaScript面向对象:类、方法、属性
- 请教Mysql如何删除 不包含 某些字符的记录
- spring+mybatis的插件【shardbatis2.0】+mysql+java自定义注解实现分表
- 香蕉派 banana pi BPI-M3 八核开源硬件开发板
- DevExpress GridControl List绑定方式下新增行的方法
- gf框架之grpool - 高性能的goroutine池
- 基于Django的独立运行的python脚本开发