哪些让Composer的autoload帮衬自定义文件后缀名,

2019-05-03 22:43 来源:未知

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

前言

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

PHP5.3之后支持了类似Java的jar包,名为phar。用来将多个PHP文件打包为一个文件。

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

首先需要修改php.ini配置将phar的readonly关闭,默认是不能写phar包的,include是默认开启的。

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

phar.readonly => On

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

创建一个phar压缩包

其原始代码如下:

<?php
$phar = new Phar('swoole.phar');
$phar->buildFromDirectory(__DIR__.'/../', '/.php$/');
$phar->compressFiles(Phar::GZ);
$phar->stopBuffering();
$phar->setStub($phar->createDefaultStub('lib_config.php'));
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 {

new Phar的参数是压缩包的名称。buildFromDirectory指定压缩的目录,第二个参数可通过正则来制定压缩文件的扩展名。

稍微修改一下:

Phar::GZ表示使用gzip来压缩此文件。也支持bz2压缩。参数修改为 PHAR::BZ2即可。

www.weide1946.com 1

setSub用来设置启动加载的文件。默认会自动加载并执行 lib_config.php。

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

执行此代码后,即生成一个swoole.phar文件。

return array(
    'Qiniu\' => array($vendorDir . '/qiniu/php-sdk/src/Qiniu’),
    // 字符串格式改为二维数组格式
    ‘Liniu\' => array([$vendorDir . ‘/Liniu/php-sdk/src/Liniu’, ‘.class.php']),
);

使用phar压缩包

www.weide1946.com,贴出代码:

<?php
include 'swoole.phar';
include 'swoole.phar/code/page.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 {

使用phar可以很方便的打包你的代码,集成部署到线上机器。

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

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如有疑问大家可以留言交流,谢谢大家对脚本之家的支持。

您可能感兴趣的文章:

  • 解决PHP 7编译安装错误:cannot stat ‘phar.phar’: No such file or directory
  • PHP管理依赖(dependency)关系工具 Composer 安装与使用
  • PHP管理依赖(dependency)关系工具 Composer的自动加载(autoload)
  • PHPer 需要了解的 5 个 Composer 小技巧
  • PHP 开发者该知道的 5 个 Composer 小技巧
  • 用 Composer构建自己的 PHP 框架之基础准备
  • PHP流Streams、包装器wrapper概念与用法实例详解
  • PHP单元测试利器 PHPUNIT深入用法(三)
  • PHP单元测试利器 PHPUNIT深入用法(二)
  • PHP单元测试利器 PHPUNIT初探
  • PHP开发之归档格式phar文件概念与用法详解【创建,使用,解包还原提取】
版权声明:本文由韦德娱乐1946_韦德娱乐1946网页版|韦德国际1946官网发布于网络编程,转载请注明出处:哪些让Composer的autoload帮衬自定义文件后缀名,