composer是一个用PHP开发的用来管理项目依赖的工具,当你在项目中声明了依赖关系后,composer可以自动帮你下载和安装这些依赖库,并实现自动加载代码。

安装composer

composer的安装非常的容易

1.下载安装脚本,这里把安装脚本保存为 composer-setup.php

  1. [root@localhost composer]# php -r "copy('https://install.phpcomposer.com/installer', 'composer-setup.php');"
  2. [root@localhost composer]# ls
  3. composer-setup.php

2. 然后执行运行安装脚本,然后会生成一个可执行的phar包文件composer.phar(类似java中的.jar包)

  1. [root@localhost composer]# php composer-setup.php
  2. All settings correct for using Composer
  3. Downloading...
  4.  
  5. Composer (version 1.5.2) successfully installed to: /root/composer/composer.phar
  6. Use it: php composer.phar
  7.  
  8. [root@localhost composer]# ls
  9. composer.phar composer-setup.php

3.执行命令: php composer.phar,  显示如下信息说明安装成功,注意最好不要使用root账户来执行composer命令,否则会报警告:

Do not run Composer as root/super user! See https://getcomposer.org/root for details

  1. [root@localhost composer]# php composer.phar
  2. Do not run Composer as root/super user! See https://getcomposer.org/root for details
  3. ______
  4. / ____/___ ____ ___ ____ ____ ________ _____
  5. / / / __ \/ __ `__ \/ __ \/ __ \/ ___/ _ \/ ___/
  6. / /___/ /_/ / / / / / / /_/ / /_/ (__ ) __/ /
  7. \____/\____/_/ /_/ /_/ .___/\____/____/\___/_/
  8. /_/
  9. Composer version 1.5.2 2017-09-11 16:59:25
  10.  
  11. Usage:
  12. command [options] [arguments]
  13.  
  14. Options:
  15. -h, --help Display this help message
  16. .....
  17.  

4.
如果想让composer在任意目录下都可以执行,可以执行命令:mv composer.phar /usr/local/bin/composer
,将 composer.phar 放到系统环境变量之下并重命名为composer,  之后便可以在任意目录使用 composer 来代替
php composer.phar 命令

  1. [root@localhost composer]# mv composer.phar /usr/local/bin/composer
  2. [root@localhost composer]# cd ~
  3. [root@localhost ~]# composer
  4. Do not run Composer as root/super user! See https://getcomposer.org/root for details
  5. ______
  6. / ____/___ ____ ___ ____ ____ ________ _____
  7. / / / __ \/ __ `__ \/ __ \/ __ \/ ___/ _ \/ ___/
  8. / /___/ /_/ / / / / / / /_/ / /_/ (__ ) __/ /
  9. \____/\____/_/ /_/ /_/ .___/\____/____/\___/_/
  10. .....
  11.  

 

配置composer使用国内镜像库

由于国内特殊的网络环境,访问国外的官方镜像库往往速度很慢,甚至无响应,所以我们配置使用composer中文网(http://www.phpcomposer.com)提供的国内镜像库,执行以下命令即可

[zyee@localhost root]$ composer config -g repo.packagist composer https://packagist.phpcomposer.com

简单的composer.json

假设我们现在的项目根目录为demo,并且我们的项目依赖 monolog(https://github.com/Seldaek/monolog) 这个php日志库,这时我们可以在项目根目录建立一个 composer.json 文件,并输入以下内容:

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

然后输入命令 composer install,composer会帮我们自动下载monolog库,一般依赖库会默认放在项目的vendor目录下

  1. [root@localhost demo]# ls
  2. composer.json
  3. [root@localhost demo]# composer install
  4. Do not run Composer as root/super user! See https://getcomposer.org/root for details
  5. Loading composer repositories with package information
  6. Updating dependencies (including require-dev)
  7. Package operations: 1 install, 0 updates, 0 removals
  8. Failed to download monolog/monolog from dist: The zip extension and unzip command are both missing, skipping.
  9. The php.ini used by your command-line PHP is: /etc/php.ini
  10. Now trying to download from source
  11. - Installing monolog/monolog (1.0.2): Cloning b704c49a30
  12. Writing lock file
  13. Generating autoload files
  14. [root@localhost demo]# ls
  15. composer.json composer.lock vendor

composer的自动加载

composer不仅仅帮我们处理依赖,还帮我们实现了自动加载。在vendor目录下有一个autoload.php, 只要在我们的项目中引入这个文件就可以自动加载依赖库。

项目根目录下新建一个index.php, 并输入以下测试代码:

  1. <?php
  2. require 'vendor/autoload.php';
  3.  
  4. use Monolog\Logger;
  5. use Monolog\Handler\StreamHandler;
  6.  
  7. $log = new Logger('demo');
  8. $log->pushHandler(new StreamHandler('app.log', Logger::WARNING));
  9. $log->addWarning("this is a warning log!");

测试是否运行正常:

  1. [root@localhost demo]# php index.php
  2. [root@localhost demo]# ls
  3. app.log composer.json composer.lock index.php vendor
  4. [root@localhost demo]# cat app.log
  5. [2017-09-28 00:32:27] demo.WARNING: this is a warning log! [] []

可以看到monolog库完全不需要我们手动去加载,只需要使用正确的命名空间,composer的自动加载机制会帮我们找到对应的文件并加载。

对于依赖库,composer帮我们处理好了自动加载,那对于我们自己的项目文件该怎么实现自动加载呢,比如现在在我的项目根目下创建一个 controllers 目录存放控制器,并在该目录下新建一个Controller.php, 代码如下:

  1. <?php
  2. namespace controllers;
  3.  
  4. class Controller
  5. {
  6. public function test()
  7. {
  8. echo "Controller::test\n";
  9. }
  10. }

现在如何在index.php中自动加载这个 Controller 类呢,如果我们直接在index.php写

  1. <?php
  2. require 'vendor/autoload.php';
  3. use controllers\Controller;
  4.  
  5. $c = new Controller();
  6. $c->test();

上面代码肯定是无法找到Controller类的:

  1. [root@localhost demo]# php index.php
  2. PHP Fatal error: Uncaught Error: Class 'controllers\Controller' not found in /root/demo/index.php:6
  3. Stack trace:
  4. #0 {main}
  5. thrown in /root/demo/index.php on line 6

要想解决上述这个问题我们首先需要了解下composer的自动加载机制。

composer支持四种自动加载的方式:PSR-0PSR-4 /ClassmapFiles , 其中 PSR-4 是当前推荐的加载方式。

什么是 PSR ?

PSR 是 PHP Standards Recommendations(PHP 标准建议)的缩写,这是一个叫做 PHP Framework Interop Group(http://www.php-fig.org/)

的组织所推出的关于PHP编程方面的一些标准建议,这个组织的成员包括一些知名的框架和项目,比如 CakePHP,Drupal,Magento,Symfony,Yii
framework,Zend Framework 2等等,当然也包括这里说的 composer,该组织曾推出了一系列的 PSR,
具体的有哪些请参考 http://www.php-fig.org/psr/ , 其中 PSR-0 (http://www.php-fig.org/psr/psr-0/)和 PSR-4(http://www.php-fig.org/psr/psr-4/)是关于自动加载方面做出的一些规范

1. Files 是最简单的加载方式,这种方式不管加载的文件是否用到始终都会加载,而不是按需加载

修改项目根目下的composer.json, 加入 "autoload" 项:

  1. {
  2. "require": {
  3. "monolog/monolog": "1.0.*"
  4. },
  5. "autoload": {
  6. "files": ["controllers/Controller.php"]
  7. }
  8. }

需要加载哪个文件,直接写入文件路径即可,路径相对项目的根目录。然后执行composer dump-autoload,该命令可以遍历我们项目根目录以及各依赖库下的 composer.json 文件然后重新生成 vendor/composer/autoload_* 跟自动加载相关的配置文件

  1. [root@localhost demo]# composer dump-autoload
  2. Do not run Composer as root/super user! See https://getcomposer.org/root for details
  3. Generating autoload files

此时composer会帮我们更新自动加载相关的配置文件,composer dump-autoload 之后composer会把配置值写入与 Files加载方式对应的 vendor/composer/autoload_files.php 配置文件中:

  1. [root@localhost demo]# cat vendor/composer/autoload_files.php
  2. <?php
  3.  
  4. // autoload_files.php @generated by Composer
  5.  
  6. $vendorDir = dirname(dirname(__FILE__));
  7. $baseDir = dirname($vendorDir);
  8.  
  9. return array(
  10. '0b001b283842589bdffd092a1d29de66' => $baseDir . '/controllers/Controller.php',
  11. );

此时再运行index.php就一切正常了

  1. [root@localhost demo]# php index.php
  2. Controller::test

2. Classmap 加载方式也很简单,composer会搜寻我们指定的目录或文件,并把搜寻到的结果写到Classmap对应的 vendor/composer/autoload_classmap.php 配置文件中。 修改composer.json :

  1. {
  2. "require": {
  3. "monolog/monolog": "1.0.*"
  4. },
  5. "autoload": {
  6. "classmap": ["controllers/"]
  7. }
  8. }

以上配置会让composer搜寻 controllers 目录下的所有类,并生成配置文件,同样先 composer dump-autoload 下:

  1. [root@localhost demo]# composer dump-autoload
  2. Do not run Composer as root/super user! See https://getcomposer.org/root for details
  3. Generating autoload files
  4.  
  5. [root@localhost demo]# cat vendor/composer/autoload_classmap.php
  6. <?php
  7.  
  8. // autoload_classmap.php @generated by Composer
  9.  
  10. $vendorDir = dirname(dirname(__FILE__));
  11. $baseDir = dirname($vendorDir);
  12.  
  13. return array(
  14. 'controllers\\Controller' => $baseDir . '/controllers/Controller.php',
  15. );

此时发现之前生成的 vendor/composer/autoload_files.php 配置文件也被 composer 删除了(由于项目中没再使用到Files的加载方式)

  1. [root@localhost demo]# ll vendor/composer/
  2. 总用量 44
  3. -rw-r--r-- 1 root root 222 9月 28 01:59 autoload_classmap.php
  4. -rw-r--r-- 1 root root 210 9月 28 01:59 autoload_namespaces.php
  5. -rw-r--r-- 1 root root 143 9月 28 01:59 autoload_psr4.php
  6. -rw-r--r-- 1 root root 1762 9月 28 01:59 autoload_real.php
  7. -rw-r--r-- 1 root root 867 9月 28 01:59 autoload_static.php
  8. -rw-r--r-- 1 root root 13451 9月 28 01:59 ClassLoader.php
  9. -rw-r--r-- 1 root root 1375 9月 28 01:59 installed.json
  10. -rw-r--r-- 1 root root 1070 9月 28 01:59 LICENSE

测试结果:

  1. [root@localhost demo]# php index.php
  2. Controller::test

3. PSR-0 ,这种加载方式已经过时,所以不推荐在新项目中使用,请用 PSR-4 来代替它。修改composer.json 如下, 然后执行composer dump-autoload

  1. {
  2. "require": {
  3. "monolog/monolog": "1.0.*"
  4. },
  5. "autoload": {
  6. "psr-0": {"controllers\\": ""}
  7. }
  8. }

以上配置的意思是指定
controllers命名空间 所在的父级目录,由于controllers命名空间所在的父级目录就是项目根目录, 所以配置值用 ""
,composer dump-autoload后配置会写入
PSR-0对应的 vendor/composer/autoload_namespaces.php 配置文件中,而且从配置文件中可以看到之前使用的
monolog 也是使用 遵循PSR-0 规范的自动加载

  1. [root@localhost demo]# composer dump-autoload
  2. Do not run Composer as root/super user! See https://getcomposer.org/root for details
  3. Generating autoload files
  4.  
  5. [root@localhost demo]# cat vendor/composer/autoload_namespaces.php
  6. <?php
  7.  
  8. // autoload_namespaces.php @generated by Composer
  9.  
  10. $vendorDir = dirname(dirname(__FILE__));
  11. $baseDir = dirname($vendorDir);
  12.  
  13. return array(
  14. 'controllers\\' => array($baseDir . '/'),
  15. 'Monolog' => array($vendorDir . '/monolog/monolog/src'),
  16. );
  17. [root@localhost demo]# php index.php
  18. Controller::test

4. PSR-4  是 PSR-0 的升级版,是目前推荐的自动加载方式,这种方式使用的是按需加载。

修改composer.json 如下:

  1. {
  2. "require": {
  3. "monolog/monolog": "1.0.*"
  4. },
  5. "autoload": {
  6. "psr-4": {"controllers\\": "controllers/"}
  7. }
  8. }

注意和PSR-0 的 composer.json 做对比,PSR-4 和 PSR-0 的主要区别是,PSR-4指定的就当作当前命名空间的目录, 而PSR-0 指定的是当前命名空间的父目录。composer dump-autoload 一下, 配置会写入PSR-4对应的 vendor/composer/autoload_psr4.php 文件中

  1. [root@localhost demo]# cat vendor/composer/autoload_psr4.php
  2. <?php
  3.  
  4. // autoload_psr4.php @generated by Composer
  5.  
  6. $vendorDir = dirname(dirname(__FILE__));
  7. $baseDir = dirname($vendorDir);
  8.  
  9. return array(
  10. 'controllers\\' => array($baseDir . '/controllers'),
  11. );
  12.  
  13. [root@localhost demo]# php index.php
  14. Controller::test

以上就是对composer的四种自动加载方式的简单介绍,这里主要偏向于使用,至于代码的实现,大家可以阅读
vendor/autoload.php 以及 vendor/composer/
目录下的相关代码,有时间我再单独写一篇composer自动加载机制实现的源码分析^^

That's it!

此文为原创,转载请注明出处 :http://blog.csdn.net/zhang197093/article/details/78118491

详解composer的自动加载机制的更多相关文章

  1. Composer 的自动加载机制

    Composer 的自动加载机制 Composer 提供了四种自动加载方式,分别是 PSR-0.PSR-4.生成 classmap 以及之间包含 files. PSR-0 方式 PSR-0 方式要求目 ...

  2. composer的自动加载机制(autoload)

    composer的出现真是让人们眼前一亮,web开发从此变成了一件很『好玩』的事情,开发一个CMS就像在搭积木,从packagist中取出『积木』搭建在自己的代码中,一点一点搭建出一个属于自己的王国. ...

  3. Yii2的深入学习--自动加载机制

    Yii2 的自动加载分两部分,一部分是 Composer 的自动加载机制,另一部分是 Yii2 框架自身的自动加载机制. Composer自动加载 对于库的自动加载信息,Composer 生成了一个  ...

  4. Yii2的深入学习--自动加载机制(转)

    Yii2 的自动加载分两部分,一部分是 Composer 的自动加载机制,另一部分是 Yii2 框架自身的自动加载机制. Composer自动加载 对于库的自动加载信息,Composer 生成了一个  ...

  5. composer 实现自动加载原理

    简介 一般在框架中都会用到composer工具,用它来管理依赖.其中composer有类的自动加载机制,可以加载composer下载的库中的所有的类文件.那么composer的自动加载机制是怎么实现的 ...

  6. PHP autoload与spl_autoload自动加载机制的深入理解

    PHP autoload与spl_autoload自动加载机制的深入理解 作者: 字体:[增加 减小] 类型:转载 时间:2013-06-05我要评论 本篇文章是对PHP中的autoload与spl_ ...

  7. Atitit. 木马病毒的外部class自动加载机制------加载class的方法总结

    Atitit. 木马病毒的外部class自动加载机制------加载class的方法总结 Atitit.java load class methods 1. 动态加载jar文件和class文件. 1 ...

  8. 深入解析 composer 的自动加载原理 (转)

    深入解析 composer 的自动加载原理 转自:https://segmentfault.com/a/1190000014948542 前言 PHP 自5.3的版本之后,已经重焕新生,命名空间.性状 ...

  9. PHP 命名空间与自动加载机制介绍

    include 和 require 是PHP中引入文件的两个基本方法.在小规模开发中直接使用 include 和 require 没哟什么不妥,但在大型项目中会造成大量的 include 和 requ ...

随机推荐

  1. 2019-7-15-win10-uwp-在笔迹开始书写拿到书写移动事件

    title author date CreateTime categories win10 uwp 在笔迹开始书写拿到书写移动事件 lindexi 2019-7-15 8:58:5 +0800 201 ...

  2. springcloud:RPC和HTTP

    1.RPC和HTTP 无论是微服务还是SOA,都面临着服务间的远程调用.那么服务间的远程调用方式有哪些呢? 常见的远程调用方式有以下2种: RPC:Remote Produce Call远程过程调用, ...

  3. 学习JDK1.8集合源码之--HashMap

    1. HashMap简介 HashMap是一种key-value结构存储数据的集合,是map集合的经典哈希实现. HashMap允许存储null键和null值,但null键最多只能有一个(HashSe ...

  4. git仓库远程连接GitHub

    1 先下载git for windows 然后一直点下一步安装. 2 安装之后,选择git gui.生成ssh 链接 git 公钥. 用命令也可以: $ ssh-keygen -t rsa -C &q ...

  5. 【同余最短路】洛谷 P2662 牛场围栏

    关于同余最短路的部分 [同余最短路]P3403跳楼机/P2371墨墨的等式 [P2662牛场围栏] 题目背景 小L通过泥萌的帮助,成功解决了二叉树的修改问题,并因此写了一篇论文, 成功报送了叉院(羡慕 ...

  6. python 数据文件操作——读入数据

  7. 小飞音箱wifi配网流程

    音箱出货时,已经内置wifi,如果无法接通,按照如下方案执行: 小飞音箱wifi配网流程 0. 接通音箱电源 通电3分钟后,音箱如果显示红色光圈,表示未联网,则需要手动联网 1. 手机下载小飞在线ap ...

  8. 阿里云杨敬宇:5G时代,边缘计算将发挥更大价值

    “5G时代,边缘计算将发挥更大价值.”3月8日,阿里云边缘计算技术负责人杨敬宇向媒体表示,边缘计算作为5G时代的一项关键技术,未来将成为不可或缺的基础设施之一. 5G时代万物智联将真正成为现实,但对计 ...

  9. bzoj 3209 花神的数论题——二进制下的数位dp

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3209 可以枚举 “1的个数是...的数有多少个” ,然后就是用组合数算在多少位里选几个1. ...

  10. php require_once的使用方法

    学习笔记 require_once 语句和 require 语句完全相同,唯一区别是 PHP 会检查该文件是否已经被包含过,如果是则不会再次包含. equire_once() 为了避免重复加载文件. ...