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

安装composerjava
composer的安装很是的容易git
1.下载安装脚本,这里把安装脚本保存为 composer-setup.phpgithub
-
[root@localhost composer]
-
[root@localhost composer]
-
2. 而后执行运行安装脚本,而后会生成一个可执行的phar包文件composer.phar(相似java中的.jar包)编程
-
[
root@localhost composer]# php composer-setup.php
-
All settings correct
for using Composer
-
-
-
Composer (version
1.5.2) successfully installed to: /root/composer/composer.phar
-
Use it: php composer.phar
-
-
[
root@localhost composer]# ls
-
composer.phar composer-setup.php
3.执行命令: php composer.phar, 显示以下信息说明安装成功,注意最好不要使用root帐户来执行composer命令,不然会报警告:json
Do not run Composer as root/super user! See https://getcomposer.org/root for details网络
-
[root@localhost composer]
-
Do
not run Composer as root/super user! See https://getcomposer.org/root for details
-
-
/ ___
_/___ ____ ___ ____ ____ ________ _____
-
/
/ / __ \/ __ `__ \/ __ \/ __ \/ ___/ _ \/ ___/
-
/ /___/ /_/ / / / / / / /_/ / /_/ (__ ) __/ /
-
\____/\____/_/ /_/ /_/ .___/\____/____/\___/_/
-
-
Composer version 1.5.2 2017-09-11 16:59:25
-
-
-
command [options] [arguments]
-
-
-
-h, --help Display this help message
-
-
4. 若是想让composer在任意目录下均可以执行,能够执行命令:mv composer.phar /usr/local/bin/composer ,将 composer.phar 放到系统环境变量之下并重命名为composer, 以后即可以在任意目录使用 composer 来代替 php composer.phar 命令
app
-
[root@localhost composer]
-
[root@localhost composer]
-
-
Do
not run Composer as root/super user! See https://getcomposer.org/root for details
-
-
/ ___
_/___ ____ ___ ____ ____ ________ _____
-
/
/ / __ \/ __ `__ \/ __ \/ __ \/ ___/ _ \/ ___/
-
/ /___/ /_/ / / / / / / /_/ / /_/ (__ ) __/ /
-
\____/\____/_/ /_/ /_/ .___/\____/____/\___/_/
-
-
配置composer使用国内镜像库composer
因为国内特殊的网络环境,访问国外的官方镜像库每每速度很慢,甚至无响应,因此咱们配置使用composer中文网(http://www.phpcomposer.com)提供的国内镜像库,执行如下命令便可框架
[zyee@localhost root]$ composer config -g repo.packagist composer https:
简单的composer.json
假设咱们如今的项目根目录为demo,而且咱们的项目依赖 monolog(https://github.com/Seldaek/monolog) 这个php日志库,这时咱们能够在项目根目录创建一个 composer.json 文件,并输入如下内容:
-
-
-
"monolog/monolog": "1.0.*"
-
-
而后输入命令 composer install,composer会帮咱们自动下载monolog库,通常依赖库会默认放在项目的vendor目录下
-
[
root@localhost demo]# ls
-
-
[
root@localhost demo]# composer install
-
Do not run Composer
as root/super user! See https:
-
Loading composer repositories with package information
-
Updating dependencies (including require-dev)
-
Package operations: 1 install, 0 updates, 0 removals
-
Failed to download monolog/monolog from dist: The zip extension and unzip command are both missing, skipping.
-
The php.ini used by your command-line PHP is: /etc/php.ini
-
Now trying to download from source
-
- Installing monolog/monolog (1.0.2): Cloning b704c49a30
-
-
Generating autoload files
-
[root@localhost demo]# ls
-
composer.json composer.lock vendor
composer的自动加载
composer不只仅帮咱们处理依赖,还帮咱们实现了自动加载。在vendor目录下有一个autoload.php, 只要在咱们的项目中引入这个文件就能够自动加载依赖库。

项目根目录下新建一个index.php, 并输入如下测试代码:
-
-
require 'vendor/autoload.php';
-
-
-
use Monolog\Handler\StreamHandler;
-
-
$log =
new Logger('demo');
-
$log->pushHandler(
new StreamHandler('app.log', Logger::WARNING));
-
$log->addWarning(
"this is a warning log!");
测试是否运行正常:
-
[root@localhost demo]# php index.php
-
[root@localhost demo]# ls
-
app.log composer.json composer.lock index.php vendor
-
[root@localhost demo]# cat app.log
-
[2017-09-28 00:32:27] demo.WARNING: this is a warning log! [] []
能够看到monolog库彻底不须要咱们手动去加载,只须要使用正确的命名空间,composer的自动加载机制会帮咱们找到对应的文件并加载。
对于依赖库,composer帮咱们处理好了自动加载,那对于咱们本身的项目文件该怎么实现自动加载呢,好比如今在个人项目根目下建立一个 controllers 目录存放控制器,并在该目录下新建一个Controller.php, 代码以下:
-
-
-
-
-
-
-
-
echo "Controller::test\n";
-
-
如今如何在index.php中自动加载这个 Controller 类呢,若是咱们直接在index.php写
-
-
require 'vendor/autoload.php';
-
use controllers\Controller;
-
-
-
上面代码确定是没法找到Controller类的:
-
[root@localhost demo]# php
index.php
-
PHP Fatal error: Uncaught Error:
Class 'controllers\Controller' not found in /root/demo/index.php:6
-
-
-
thrown
in /root/demo/index.php on line 6
要想解决上述这个问题咱们首先须要了解下composer的自动加载机制。
composer支持四种自动加载的方式:PSR-0 / PSR-4 /Classmap / Files , 其中 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" 项:
-
-
-
"monolog/monolog": "1.0.*"
-
-
-
"files": ["controllers/Controller.php"]
-
-
须要加载哪一个文件,直接写入文件路径便可,路径相对项目的根目录。而后执行composer dump-autoload,该命令能够遍历咱们项目根目录以及各依赖库下的 composer.json 文件而后从新生成 vendor/composer/autoload_* 跟自动加载相关的配置文件
-
-
Do
not run Composer as root/super user! See https://getcomposer.org/root for details
-
Generating autoload files
此时composer会帮咱们更新自动加载相关的配置文件,composer dump-autoload 以后composer会把配置值写入与 Files加载方式对应的 vendor/composer/autoload_files.php 配置文件中:
-
-
-
-
-
-
$vendorDir = dirname(dirname(
__FILE__));
-
$baseDir = dirname($vendorDir);
-
-
-
'0b001b283842589bdffd092a1d29de66' => $baseDir . '/controllers/Controller.php',
-
此时再运行index.php就一切正常了
-
[root@localhost demo]# php index.php
-
2. Classmap 加载方式也很简单,composer会搜寻咱们指定的目录或文件,并把搜寻到的结果写到Classmap对应的 vendor/composer/autoload_classmap.php 配置文件中。 修改composer.json :
-
-
-
"monolog/monolog": "1.0.*"
-
-
-
"classmap": ["controllers/"]
-
-
以上配置会让composer搜寻 controllers 目录下的全部类,并生成配置文件,一样先 composer dump-autoload 下:
-
-
Do not run Composer as root/super user! See https:
-
Generating autoload files
-
-
-
-
-
-
-
$vendorDir = dirname(dirname(
__FILE__));
-
$baseDir = dirname($vendorDir);
-
-
-
'controllers\\Controller' => $baseDir . '/controllers/Controller.php',
-
此时发现以前生成的 vendor/composer/autoload_files.php 配置文件也被 composer 删除了(因为项目中没再使用到Files的加载方式)
-
[root@localhost demo]# ll vendor/composer/
-
-
-rw-r--r-- 1 root root 222 9月 28 01:59 autoload_classmap.php
-
-rw-r--r-- 1 root root 210 9月 28 01:59 autoload_namespaces.php
-
-rw-r--r-- 1 root root 143 9月 28 01:59 autoload_psr4.php
-
-rw-r--r-- 1 root root 1762 9月 28 01:59 autoload_real.php
-
-rw-r--r-- 1 root root 867 9月 28 01:59 autoload_static.php
-
-rw-r--r-- 1 root root 13451 9月 28 01:59 ClassLoader.php
-
-rw-r--r-- 1 root root 1375 9月 28 01:59 installed.json
-
-rw-r--r-- 1 root root 1070 9月 28 01:59 LICENSE
测试结果:
-
[root@localhost demo]# php index.php
-
3. PSR-0 ,这种加载方式已通过时,因此不推荐在新项目中使用,请用 PSR-4 来代替它。修改composer.json 以下, 而后执行composer dump-autoload
-
-
-
"monolog/monolog": "1.0.*"
-
-
-
"psr-0": {"controllers\\": ""}
-
-
以上配置的意思是指定 controllers命名空间 所在的父级目录,因为controllers命名空间所在的父级目录就是项目根目录, 因此配置值用 "" ,composer dump-autoload后配置会写入 PSR-0对应的 vendor/composer/autoload_namespaces.php 配置文件中,并且从配置文件中能够看到以前使用的 monolog 也是使用 遵循PSR-0 规范的自动加载
-
-
Do not run Composer as root/super user! See https:
-
Generating autoload files
-
-
-
-
-
-
-
$vendorDir = dirname(dirname(
__FILE__));
-
$baseDir = dirname($vendorDir);
-
-
-
'controllers\\' => array($baseDir . '/'),
-
'Monolog' => array($vendorDir . '/monolog/monolog/src'),
-
-
-
4. PSR-4 是 PSR-0 的升级版,是目前推荐的自动加载方式,这种方式使用的是按需加载。
修改composer.json 以下:
-
-
-
"monolog/monolog": "1.0.*"
-
-
-
"psr-4": {"controllers\\": "controllers/"}
-
-
注意和PSR-0 的 composer.json 作对比,PSR-4 和 PSR-0 的主要区别是,PSR-4指定的就看成当前命名空间的目录, 而PSR-0 指定的是当前命名空间的父目录。composer dump-autoload 一下, 配置会写入PSR-4对应的 vendor/composer/autoload_psr4.php 文件中
-
-
-
-
-
-
$vendorDir = dirname(dirname(
__FILE__));
-
$baseDir = dirname($vendorDir);
-
-
-
'controllers\\' => array($baseDir . '/controllers'),
-
-
-
-
以上就是对composer的四种自动加载方式的简单介绍,这里主要偏向于使用,至于代码的实现,你们能够阅读 vendor/autoload.php 以及 vendor/composer/ 目录下的相关代码,有时间我再单独写一篇composer自动加载机制实现的源码分析^^
That's it!
此文为原创,转载请注明出处 :http://blog.csdn.net/zhang197093/article/details/78118491