`

Composer实现PHP中类的自动加载

 
阅读更多

转自 : http://www.cnblogs.com/yue-blog/p/5904275.html

 

依赖管理

  在composer出现之前,如果咋PHP项目中需要第三方的依赖文件,则需要程序员将所需要的源代码拷贝进工程中或者将源代码对应的文件下载下来手动添加到工程中。如果所需要的依赖文件依赖于更多的第三方文件,则程序员会陷入拷贝依赖文件的黑洞中,费时费力不说,有可能还会出现一些失误,composer就是在这种情况下出现的用于减轻程序员的对于依赖管理的负担的工具。

  Composer通过使用配置文件composer.json文件完成依赖管理。composer.json文件包含了项目的简单介绍、项目对于外界的库或文件的依赖。从composer.json的扩展名就可以看得出来,composer.json中的内容是按照json标准组织的。本篇博客集中在类的自动加载机制上,因此对于composer.json中关于项目的作者等相关信息的解释忽略不解释。

  在composer中将本项目所需要的外部依赖包写在关键字require对应的值中,require键可以对应着多个所需要的包,各个不同的包之间用逗号分隔。假设项目需要一个外部依赖包monolog,下面是在compose.json文件中对于monolog包的依赖配置项:

1
2
3
4
5
{
    "require":{
        "monolog/monolog""1.0.* @dev"
    }
}

  如上所示,require关键字将会映射包的名称monolog和包的版本1.0.*。其中,包的名称有两部分组成,中间以“/”分隔,“/”之前代表的包的所有者,在Github上一般是代表的Github的用户名,“/”代表的是实际的包的名称。其中“/”之前的名称必须是唯一的,但是"/"之后的包的名称是可以存在重复的,例如“Jack/monolog”和“monolog/monolog”是可以共存的。而后面的"1.0.*"代表的是所依赖的包的版本,其中“*”代表的是“1.0”之下的任意一个版本,例如:1.0.1,1.0.2或者1.0.9等等。“@dev”代表了可以获取该包的开发版本。默认情况下,composer将获取所需要的包的最新的稳定版本,而不会考虑开发版本,因为开发版本一般是不太稳定的版本。但是,如果确定开发版本没有什么问题就可以加上“@dev”以允许获取开发的版本。如果没有加上“@dev”,而除了开发版本之外不存在别的版本的话,则composer加载依赖项出错。

  在composer中配置好依赖的第三方的包之后,就可以使用composer install命令获取第三方的包了。运行成功之后就可以项目中就会出现vendor文件夹,vendor文件夹中会包含我们在require中所列出的monolog文件。

  出了生成列在composer.json中关键字require值下的文件之外,成功运行composer install之后还会生成对应的composer.lock文件,该文件依据composer.json中的依赖项生成依赖包对应的版本。这里需要说明的是,在我们运行composer install的时候会首先判断是否存在着composer.lock文件。如果原本就存在这composer.lock文件,那么就会直接根据composer.lock中的版本下载对应的包,此时不再理会composer.json中的配置项。如果不存在composer.lock文件,则根据composer.json文件中的配置下载对应的版本,并生成composer.json对应的composer.lock文件。composer.lock又称为锁定文件,生成对应的composer.lock之后,composer.json和composer.lock共同对版本进行控制。有了composer.lock之后,及时有了新的版本也不会触发新版本的更新,除非手动使用composer update命令进行手动的更新。

  开发环境下的依赖

  有的时候我们只是在开发的时候才会依赖于某个具体的包,但是在发行的版本中并不需要这样的包,为了达到这种要求可以使用require-dev引入开发环境下的包依赖。如下:

1
2
3
4
5
{
    "require-dev":{
        "xxxx/xxxx""x.x.* @dev"
    }
}

  自动加载类

  通过composer.json或者composer.lock,所依赖的第三方库已经被下载下来了,那么在我们的项目中怎么使用这些第三方库呢?最简单的方式就是通过include或者require将所需要的类文件包含进来,但是这种方式需要我们自己去寻找所使用的类对应的类文件,这就存在和PHP语言中直接使用include和require加载所需要的类存在同样的弊端,一种比较简单的方式当然就是使用composer提供的类的自动加载机制了。类似于PHP的自动加载机制,composer提供了autoload实现类的自动加载。

  成功运行composer install之后,只要调用生成的vendor目录下的autoload.php文件就可以调用通过composer.json加载的类了。以上面所述的项目中需要monolog包为例,通过可以通过下面的方式使用monolog包中的Logger类。  

1
2
include "vendor/autoload.php";
$log new Monolog\Logger("name");

  当然,除了使用第三方库中提供的类之外,还可以使用自己的定义的类。Composer提供了autoload关键字用于加载我们自己提供的类,假如我们定义了一个有关测试的类,如下:

1
2
3
4
5
6
7
class ClassTest{
 
    public function test()
    {
        echo "hello world!";
    }
}

  将该类放在lib目录下的ClassTest.php文件夹下面,那么怎么让composer加载自己定义的类呢?

  1. 在composer.json中加入autoload关键字  

1
2
3
"autoload":{
    "files":["lib/ClassTest.php"];
}

  files键对应的值是一个数组且改值是相对于文件应用根目录的文件的路径。在composer.json中加入上述的关键字之后,在命令行下运行composer dump-autoload就可以让composer重建加载信息,那么就可以在其他的文件中使用这个类了。

  上述所述的方法和PHP中直接使用include和require存在一样的弊端,每个类都需要重新书写加载文件,费时费力。

  2. composer.json中加入classmap关键字

  相比于每个类文件都需要加载一次的做法,使用classmap关键字,能够减少程序员的负担,只需要将文件所在的目录添加在classmap的值中即可,如下: 

1
"classmap" : ["lib"]

  其实这需要建立一种类名到类所在的文件的映射关系。当需要相应的类的时候,composer通过类名找到对应的类文件名,将相应的类include进来。但是这同样存在一个问题就是,每增加一个类都需要重新运行一次composer dump-autoload重新创建类名到文件之间的映射关系,从而将对应的类加载进来。虽然比files关键字节省了功夫,但是依然不能完全自动加载所需要的类。

  3. 基于PHP规范的自动加载方式

  针对PHP这种编程语言,到目前FIG指定了五个规范,分别如下:

  • PSR0:自动加载;
  • PSR1:基本代码规范;
  • PSR2:代码样式规范;
  • PSR3:日志接口规范;
  • PSR4:自动加载规范;

  看上去PSR4与PSR0是重复了,但是PSR4规范比较干净,可以看成PSR0规范的升级版。二者最重要区别在于:PSR0规范中,下划线会被转换为目录分隔符,但是PSR4中下划线不具有特殊的含义。二者都是通过特定的目录、文件名以及类名,实现快速查找到类文件,并将相应的类加载进来。

  PSR0和PSR4要求有个命名的空间,对上述的ClassTest类做相应的修改如下:  

1
2
3
4
5
6
7
8
9
<?php
namespace ClassTestLib;
class ClassTest{
 
    public function test()
    {
        echo "hello world!";
    }
}

  那么对应的文件的路径应该改为\lib\ClassTestLib\ClassTest.php,此时修改composer.json中的autoload如下:

1
2
3
4
5
"autoload":{
    "psr-0":{
        "ClassTestLib":"lib/"
    }  
}

  可能你发现psr0的值有一些奇怪,是的。在这里ClassTestLib代表的是命名空间,而"lib"是目录名。加载对应的类文件的时候,搜索的路径是lib/ClassTestLib,而不是ClassTestLib/lib,这是在书写composer.json的时候需要注意的一点。

  如果命名空间中存在着“\”,则在书写对应的composer.json的时候需要在相应的“\”再添加一个“\”。例如,如果命名空间改为ClassTest\Lib,相应的对应与应用根目录的路径名称应该变为\lib\ClassTest\Lib\ClassTest.php,对应的composer.json中的autoload应该变为:

1
2
3
4
5
"autoload":{
    "psr-0":{
        "ClassTest\\Lib":"lib/"
    }  
}

  

分享到:
评论

相关推荐

    composer自动加载测试代码

    这些代码可能涉及到创建不同命名空间的类,以及如何在`composer.json`中正确配置自动加载规则。通过查看和运行这些代码,可以更深入地理解Composer自动加载的工作原理。 总之,Composer的自动加载机制极大地简化了...

    Laravel框架中composer自动加载的实现分析

    laravel 框架是通过composer 实现的自动加载。 是通过 下面的代码实现的。 require_once __DIR__ . '/composer' . '/autoload_real.php'; return ComposerAutoloaderInit7b20e4d61e2f88170fbbc44c70d38a1f::...

    composer php composer

    2. **自动加载**:Composer 生成一个自动加载文件,可以在项目中轻松加载所有安装的库,避免了手动导入类文件的繁琐工作。 3. **版本控制**:通过指定库的版本号,你可以确保项目依赖于特定版本的库,从而避免因库...

    Composer-Setup php Composer安装包

    此外,Composer还有其他实用功能,如`require`命令用于临时添加依赖,`dump-autoload`用于重新生成类自动加载映射,以及`remove`命令用于移除不再需要的依赖等。 总之,Composer是PHP开发不可或缺的一部分,它简化...

    类的自动加载.zip

    总结一下,`spl_autoload_register`函数使得在PHP中实现类的自动加载变得简单,通过注册自定义的自动加载函数,我们可以更有效地组织和管理代码。这个功能特别适用于大型项目,其中包含大量的类和文件。通过遵循一致...

    composer指定php版本.docx

    在PHP开发中,Composer是一个至关重要的工具,它用于管理和自动加载项目依赖。有时,由于项目的特定需求或环境限制,我们可能需要确保Composer依赖于特定版本的PHP。本篇将详细介绍如何在Linux环境下指定Composer...

    php composer 附带使用方法和常用包名称

    5. **自动加载**:Composer自动生成`vendor/autoload.php`文件,通过引入这个文件,可以自动加载所有依赖的类。例如: ```php require_once __DIR__ . '/vendor/autoload.php'; ``` 现在,我们来看看一些常用的...

    使用composer构建自己的简单的PHP框架,适合初学者

    在上述配置中,我们指定了PHP版本要求,并设置了PSR-4自动加载规则,这样Composer会在`app/`目录下查找命名空间为`App`的类。 接下来,我们需要创建基本的MVC结构。在`app/`目录下创建`Controllers`、`Models`和`...

    ComposerPSR4Example:使用Composer进行PSR-4自动加载的基本示例

    当尝试学习如何在PHP中结合Composer的PSR-4自动加载规范使用命名空间时,我找不到一个可靠的工作示例。 我了解自动加载的原理,了解名称空间为什么很好-我只想要一个工作模板,以便可以开始编码。 好吧,我找不到一...

    ComposerPHP

    4. **自动加载**:Composer自动生成`vendor/autoload.php`文件,用于自动加载所有声明的类,无需手动`require`每个文件。 ### 四、Composer的高级用法 1. **约束版本**:可以使用`~`, `^`, `&gt;=`, `等运算符来约束...

    composer.rar

    3. **自动加载**:Composer提供了一种自动加载机制,能自动包含项目中所有依赖的类,简化了代码组织和加载过程。 4. **包注册**:Composer通过Packagist,一个公开的PHP包仓库,来查找和获取库。开发者也可以将自己...

    Composer-Setup.zip

    Composer是PHP开发中不可或缺的一部分,它是一个用于管理和自动加载PHP项目的依赖关系的工具。通过Composer,开发者可以方便地声明项目所需的库和其他软件包,并确保它们按照正确的版本和顺序被安装和加载。标题中的...

    Composer 管理工具

    2. **自动加载**:Composer 提供了自动加载功能,可以将所有安装的库自动注册到PHP的命名空间中,简化了类的加载过程,遵循 PSR-4 或 PSR-0 标准。 3. **版本控制**:通过Composer,开发者可以精确地控制依赖库的...

    一个轻量级的php命名空间感知自动加载生成器和phar归档生成器_PHP_Smarty_下载.zip

    PHP的自动加载通常基于SPL(Standard PHP Library)中的`spl_autoload_register()`函数来实现。这个函数可以注册一个或多个回调函数,当尝试实例化未定义的类或接口时,这些回调函数会被调用,试图加载对应的类文件...

    composer-php

    Composer 还提供了自动加载机制,可以自动加载您的项目中所需的类文件,减少手动包含文件的工作量。 通过使用 Composer,您可以更方便地管理 PHP 项目的依赖项,提高开发效率,并确保项目的依赖关系正确、一致和...

    php自动加载方式集合

    ### PHP自动加载方式集合 #### 知识点一:常规加载方式 在PHP中,常规加载类的方式主要依靠以下四个函数: - `include` - `include_once` - `require` - `require_once` 这些函数的作用是将指定的文件包含进来。...

    thinkphp5使用composer引入PhpSpreadsheet导出带公式的excel表格demo

    TP5的特点包括模块化、路由管理、数据库操作、错误处理和自动加载机制等,使得开发者能够更高效地构建Web应用。 Composer是PHP的一个依赖管理工具,它允许开发者声明项目所依赖的外部库,并自动下载和管理这些库...

Global site tag (gtag.js) - Google Analytics