1、简介
Composer 是PHP的一个包依赖管理工具,类似Ruby中的RubyGems或者Node中的NPM,它并非官方,但现在已经非常流行。
Framework Interoperability Group(框架可互用性小组),简称 FIG,成立于 2009 年。FIG 最初由几位知名 PHP 框架开发者发起,在吸纳了许多优秀的大脑和强健的体魄后,提出了 PSR-0 到 PSR-4 五套 PHP 非官方规范:
PSR-0 (Autoloading Standard) 自动加载标准
PSR-1 (Basic Coding Standard) 基础编码标准
PSR-2 (Coding Style Guide) 编码风格向导
PSR-3 (Logger Interface) 日志接口
PSR-4 (Improved Autoloading) 自动加载优化标准
之后,在此标准之上,Composer 横空出世!Composer 利用 PSR-0 和 PSR-4 以及 PHP5.3 的命名空间构造了一个繁荣的 PHP 生态系统。Composer 类似著名的 npm 和 RubyGems,给海量 PHP 包提供了一个异常方便的协作通道,Composer Hub 地址:https://packagist.org/。Composer 中文网站:http://www.phpcomposer.com/。
目前 PHP 界风头正劲的 Laravel 和 Symfony 均直接基于 Composer,大家耳熟能详著名框架 CI 和 Yii 的正开发版本 CodeIgniter 3 和 Yii 2 也都基于 Composer(更新:北京时间2014年10月13日 Yii 2 已经发布)。Composer 就是 PHP 框架的未来,有了它,让 CI 的路由和 Laravel 的 Eloquent ORM 协作就会变的非常简单。
2、如何使用composer
(composer如何安装请自行参考官方demo)
在合适的地方新建一个文件夹,命名为 mffc,在该文件夹下新建文件 composer.json:
{
"require": { } }
以windows来说,打开命令行,cd到该目录下执行,composer update
如果出现如下目录结构
说明Composer初始化安装成功
我们简单分析下:
依次打开autoload_classmap.php、autoload_namespaces.php和autoload_psr4.php我们发现代码最后都返回了一个空数组,其实这里才是包含我们要自动加载的类、命名空间、或者文件(autoload_files.php)初始的时候这里并没有生成该文件。下面我们修改下composer.json,代码如下:
{
"require" : { },
"autoload" : { "files" : ["core/helper.php"], "psr-4" : { "Core\\" : "core/" } } }
再次执行composer update ,你会发现在vendor文件夹下生成了autoload_files.php, 里面的返回数组如下
return array(
'f04f8f12be659595d41ed38b5bb9869f' => $baseDir . '/core/helper.php',
);
同时在autoload_psr4.php返回的数组也增加了一行数据,
return array(
'Core\\' => array($baseDir . '/core'),
);
3、加载方式
对于第三方包的自动加载,Composer提供了四种方式的支持,分别是 PSR-0和PSR-4的自动加载,生成class-map,和直接包含files的方式。
① PSR-4是composer推荐使用的一种方式,因为它更易使用并能带来更简洁的目录结构。在composer.json里是这样进行配置的:
{
"autoload": { "psr-4": { "Foo\\": "src/", } } }
key和value就定义出了namespace以及到相应path的映射。按照PSR-4的规则,当试图自动加载 “Foo\Bar\Baz” 这个class时,会去寻找 “src/Bar/Baz.php” 这个文件,如果它存在则进行加载。注意, “Foo\”并没有出现在文件路径中,这是与PSR-0不同的一点,如果PSR-0有此配置,那么会去寻找”src/Foo/Bar/Baz.php”这个文件。另外注意PSR-4和PSR-0的配置里,”Foo\”结尾的命名空间分隔符必须加上并且进行转义,以防出现”Foo”匹配到了”FooBar”这样的意外发生。在composer安装或更新完之后,psr-4的配置换被转换成namespace为key,dir path为value的Map的形式,并写入生成的 vendor/composer/autoload_psr4.php 文件之中。
② PSR-0方式
{
"autoload": { "psr-0": { "Foo\\": "src/", } } }
这个配置也以Map的形式写入生成的vendor/composer/autoload_namespaces.php文件之中。
③ Class-map方式
通过配置指定的目录或文件,然后在Composer安装或更新时,它会扫描指定目录下以.php或.inc结尾的文件中的class,生成class到指定file path的映射,并加入新生成的 vendor/composer/autoload_classmap.php 文件中(前提是目录和文件已经存在,否则composer在扫描时会报错)
{
"autoload": { "classmap": ["src/", "lib/", "Something.php"] } }
例如src/下有一个BaseController类,那么在autoload_classmap.php文件中,就会生成这样的配置:
'BaseController' => $baseDir . '/src/BaseController.php'
④ Files方式
就是手动指定供直接加载的文件。比如说我们有一系列全局的helper functions,可以放到一个helper文件里然后直接进行加载
{
"autoload": { "files": ["src/MyLibrary/functions.php"] } }
它会生成一个array,包含这些配置中指定的files,再写入新生成的vendor/composer/autoload_files.php文件中,以供autoloader直接进行加载。
4:demo
在mffc目录下新建src目录,在src文件夹里新建test.php ,代码如下:
<?php class TestController { public $id = ''; public $name = ''; public function show() { echo 'autoload'; } }
在mffc下新建something.php 代码如下
<?php require './vendor/autoload.php'; $test = new TestController; echo $test->show();
一定要先引入 require ‘./vendor/autoload.php’; 这样才能使用composer的自动加载机制