转自 : 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/"
}
} |
相关推荐
laravel 框架是通过composer 实现的自动加载。 是通过 下面的代码实现的。 require_once __DIR__ . '/composer' . '/autoload_real.php'; return ComposerAutoloaderInit7b20e4d61e2f88170fbbc44c70d38a1f::...
Composer 还提供了自动加载机制,可以自动加载您的项目中所需的类文件,减少手动包含文件的工作量。 通过使用 Composer,您可以更方便地管理 PHP 项目的依赖项,提高开发效率,并确保项目的依赖关系正确、一致和...
当尝试学习如何在PHP中结合Composer的PSR-4自动加载规范使用命名空间时,我找不到一个可靠的工作示例。 我了解自动加载的原理,了解名称空间为什么很好-我只想要一个工作模板,以便可以开始编码。 好吧,我找不到一...
pico-load-plugins-composer 从 Composer vendor目录自动加载 Pico 插件。 这避免了plugins目录不必要的混乱,并根据您的配置设置通过辅助插件加载插件。第 1 步:将此存储库添加到您的 composer.json "repositories...
由于新版ThinkPHP完全采用了命名空间的特性,因此只需要给类库正确定义所在的命名空间,而命名空间的路径与类库文件的目录一致,那么就可以实现类的自动加载。 类库的自动加载检测顺序如下: 1、类库映射检测; 2、...
项目设置a)补丁需要在Composer的extra配置区域中声明(仅根软件包): " extra " : { " magento-root-dir " : " public " , " patches " : { " patch-group-1 " : { " patch-name-1 " : { " type " : " patch " , ...
PHP composer.json支持 将代码完成,...文件路径完成(在bin,自动加载等中) “脚本”属性中的类和静态方法名称命名空间在“ autoload.psr-0”属性中检查: composer.json模式+快速修复(删除条目/属性,创建属性等)
Composer 是PHP的一个包依赖管理工具,类似Ruby中的RubyGems或者Node中的NPM,它并非官方,但现在已经非常流行。此文并不介绍如何使用Composer,而是关注于它的autoload的内容吧。
作曲家合并插件 在运行时合并多个... 然后,在下载其他库并生成自动加载器时将使用此组合配置。 创建Composer Merge插件是为了帮助安装, 具有核心库要求以及可以通过Composer管理的可选库和扩展。 安装 Composer
利用 Composer 自动加载的强大功能。 用于本地、暂存或生产的多个配置文件。 为什么? 因为 WordPress 本身就是一个依赖项! 我们需要工具将 WordPress 开发带入现代时代。 git 子模块的一个不错的替代品。 ...
RobotLoader是一种工具,可让您轻松地为整个应用程序(包括第三方库)自动加载类。 摆脱所有require 不需要严格的目录或文件命名约定 极快 无需手动更新缓存,一切都会自动运行 高度成熟,稳定且使用广泛的库 因此...
该库提供的自定义工作将这将近2,000个类分离到各自的文件中,并允许使用composer安装这些类并使用标准自动加载支持对其进行访问。 它允许从环境中读取配置,添加对日志请求和响应的支持,并提供简化的客户端包装...
快速PHP客户端 通过Composer安装 推荐的安装Fastly-PHP的...Composer还准备一个自动加载文件,该文件能够自动加载它下载的任何库中的所有类。 要使用它,只需将以下行添加到代码的引导过程中: <?php require 've
Laravel 凉亭组件自动加载通过 Bower 安装的所有前端依赖项(即 js/css 资产)。 组件将自动排序,以便组件所需的依赖项在它们之前加载。安装需要 Composer 这个包: composer require kosiec/laravel-bower更新 ...
这使您可以非常轻松地在基于PHP的项目中管理资产依赖项。 重要: Composer Asset Plugin的下一个主要版本是如此不同,但是与当前版本不兼容,因此它成为名为的新项目。 Foxy是管理PHP库资产的新方法,因为它...
优先级由包之间的依赖关系自动确定,这些依赖关系通常位于项目根文件夹中的composer.json中。 如果包package_A需要包package_B ,则包package_B优先级高于包package_A优先级。 这种方法能够从所有 Composer 加载的...
# 在项目中加载初始化文件 include "您的目录/Express/include.php"; ``` * 获取所有快递公司列表 ```php // 参考https://m.baidu.com/s?word=快递 try { $number = 'YT5744661853493'; //cookie存放路径 $...
在您的composer.json文件中需要此安装程序: "require": { … "webgriffe/magento-installer": "dev-master", … } 然后执行以下命令: $ composer update webgriffe/magento-installer 用法 在您的项目中的...
其实是可以的,composer 注册的自动加载方法是在类被调用的时候根据类的命名空间去查找位置,这种写法对其没有影响。 1. 运算符(NULL 合并运算符) 把这个放在第一个说是因为我觉得它很有用。用法: ? 1 ...