博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
如何让Composer的autoload支持自定义文件后缀名
阅读量:6971 次
发布时间:2019-06-27

本文共 3236 字,大约阅读时间需要 10 分钟。

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 {

稍微修改一下:

img_a2db07a48c3e819fee4eece9631befe1.png

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 {

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

转载地址:http://tudsl.baihongyu.com/

你可能感兴趣的文章
34. Find First and Last Position of Element in Sorted Array
查看>>
113. Path Sum II
查看>>
Jenkins定时构建和轮询SCM设置说明
查看>>
Poj(2421),Prim最小生成树
查看>>
UPS故障案例集(二)
查看>>
[luogu 3803]【模板】多项式乘法
查看>>
MySQL中的锁、隔离等级和读场景
查看>>
流弊博客集锦(updating)
查看>>
dedecms 的这个dede:arclist里怎么调用全局变量?
查看>>
eclipse上跑项目越来越慢的解决办法
查看>>
个人开公司的流程,以后用得着(经典)(转)
查看>>
跟踪内核启动过程CONFIG_DEBUG_LL【转自】
查看>>
系统数据文件和信息
查看>>
Laravel 程序架构设计思路:使用动作类
查看>>
Java线程池实现原理与技术(ThreadPoolExecutor、Executors)
查看>>
Linux内核读书笔记第五周链接
查看>>
工厂模式(Factory Patter)
查看>>
痛苦的 01 矩阵(和式推导)
查看>>
我的Python成长之路---第三天---Python基础(11)---2016年1月16日(雾霾)
查看>>
intellij idea 用法
查看>>