编程发展到现在,每一门好的编程语言都需要管理依赖。我们的php也是如此,强大的社区造出的轮子数不胜数,我们是站在巨人的肩膀上编程啊~
我们将开始介绍composer这一强大的依赖管理工具。
你想知道php社区在哪里存储全球程序员编写的代码类库?
packagist是php的巨大代码库,composer是一个依赖管理器,它允许我们从packagist直接下载代码库到我们的项目。你应该熟悉packagist和composer,这可以让我们轻松地找到php库,将它们下载到我们的项目并管理它们。
$ curl -s https://getcomposer.org/installer | php
比如现在我们需要monolog包来打日志,先进到你的项目根目录,然后在命令行上执行。
$ composer require monolog/monolog
一旦你按下回车键,composer就会开始自动下载你需要的软件包的最新稳定版本。它还会生成一个自动加载文件。
当下载过程结束时,你会看到根目录下多了一个composer.json文件,以及vendor目录。
在composer.json文件中,你可以看到自己的项目目前依赖哪些包以及包的版本。
{
"require": {
"monolog/monolog": "^1.23"
}
}
注意:你需要在vendor目录中找到autoload.php文件,并且在项目的入口文件中引入.
index.php
<?php
require_once __DIR__ . '/vendor/autoload.php';
use Monolog\Logger;
use Monolog\Handler\StreamHandler;
$log =new Logger ('name');
$log->pushHandler (new StreamHandler('path/to/your.log', Logger::WARNING));
$log->warning('Foo');
$log->error('Bar');
我们只需继续执行composer require 即可。比如:
$ composer require fzaninotto/faker
执行之后,我们的composer.json文件发生了改变
{
"require": {
"fzaninotto/faker": "1.4.0",
"monolog/monolog": "~1.13"
}
}
有可能,随着时间的推移,我们将不得不更新软件包。只需在根目录执行就ok了~!
作为此命令的结果,composer将自动将所有更新版本的软件包(包括所有依赖项)直接下载到项目文件夹中。
为了删除其中一个包,我们需要从composer.json文件中先把相应的包所在的行删除,然后再执行:
这将从vendor目录中删除具有所有依赖关系的软件包。
Psr-4是一种自动加载的规范。精髓是把命名空间的前缀和文件系统中的目录对应起来。
当执行composer install时,会优先读取composer.lock文件(会应用之前.lock文件生成时的配置)。
只有执行composer update才能再次从json文件中获取最新的配置,并且生成新的json.
这应该是最最简单的 autoload 模式了。大概的意思就是这样的:
然后 composer 在背后就会读取这个文件夹中所有的文件 然后再 vendor/composer/autoload_classmap.php中怒将所有的 class 的 namespace + classname 生成成一个 key => value 的 php 数组
<?php
return [
'App\\Console\\Kernel' => $baseDir . '/app/Console/Kernel.php'
];
?>
这个标准出来的时候一片喷声,大概的意思就是 FIG 都是傻逼么,刚刚出了 psr-0 然后紧跟着进推翻了自己。不过 FIG 也有自己的苦衷,帮没有 namespace 支持的 php5.2 擦了那么久的屁股,在2014年10月21日的早晨,终于丢失了睡眠。
抛弃了 psr-0 的 composer 从此变得非常清爽。
最简单来讲就是可以把 prs-4 的 namespace 直接想想成 file structure
{
"name": "acme/util",
"auto" : {
"psr-4": {
"Acme\\Util\\": "src/"
}
}
}
vendor/
acme/
util/
composer.json
src/
ClassName.php
可以看到将 Acme\Util 指向了 src 之后 psr-4 就会默认所有的 src 下面的 class 都已经有了 Acme\Util 的 基本 namespace
然而这还是不够。因为可能会有一些全局的 helper function 的存在。
{
"files": [
"path/to/file.php"
]
}
composer自动加载的原理是通过 spl_autoload_register 函数
spl_autoload_register的功能是:注册一个给定的函数作为__autoload() 的实现。
可以通过spl_autoload_functions()查看当前自动加载hashtable中的函数,该函数返回一个数组。注意,使用spl_autoload时,系统会忽略拦截 器__autoload,除非显式地使用spl_autoload_register('__autoload')将其加入hashtable。
SPL 是Standard PHP Library(标准PHP库)的缩写。它是PHP5引入的一个扩展库,其主要功能包括autoload机制的实现及包括各种Iterator接口或类。 SPL autoload机制的实现是通过将函数指针autoload_func指向自己实现的具有自动装载功能的函数来实现的。
spl_autoload 是SPL实现的默认的自动加载函数,它的功能比较简单。函数功能有限,只能在inlcude_path中搜索指定扩展名的类库。
怎样让spl_autoload自动起作用呢,也就是将autoload_func指向spl_autoload?答案是使用 spl_autoload_register函数。在PHP脚本中第一次调用spl_autoload_register()时不使用任何参数,就可以将 autoload_func指向spl_autoload。
当需要使用自动加载功能时,使用函数spl_autoload_register()或spl_autoload_register('autoloadfuncitonname'),无参的spl_autoload_register()会默 认加载spl_autoload()函数,该函数功能有限,只能在inlcude_path中搜索指定扩展名的类库。有参的spl_autoload_register()默认不再加载spl_autoload()函数。