Composer 入门简介
目前最流行的 PHP 开发框架,采用的都是 Composer 包管理器,不管是Symphony,Laravel,还是国内的 Think PHP 5,Think PHP 5,Slim 等,之所以 Composer 得到众多框架的认可,主要是它更好的解决了包之间的依赖关系,把第三方的开发包管理组织的更为合理。学习 和使用 Composer 已经成为现代 PHP 程序员绕不开的一个环节。掌握 Composer 之后,世界上大量优质的第三方技能包我们都可以拿过来直接用,极大的提升开发速度和开发质量。学习和使用框架的时候也会得心应手。
一切都从安装开始
composer安装参考:https://www.phpcomposer.com/
window系统composer下载:https://getcomposer.org/download/
使用 composer require 安装 composer 包
1、composer ini初始化composer配置文件使用
2、composer包下载地址:https://packagist.org/
例如下载illuminate包
composer require illuminate/container
包加载顺序,先加载依赖最后才加载自己
3、目录讲解
vendor:核心文件
-composer:与autoload.php共同完成类的自动加载
-illuminate
-psr
autoload.php
composer install 和 composer update
在composer 结合github平台开源项目中,.gitignore文件下都会将不会修改的/vendor进行过滤,那么通过git pull拉取到的项目是缺少/vendor等目录文件的,这时候就需要用到composer install或者composer update命令了
composer install:拉取当前composer.json文件中指定的版本包(一般的是经过开发测试稳定的版本)
composer update:拉取远程composer仓库中最新的版本包(慎用,需要经过测试后再投入生产环境中)
composer.json composer.lock 文件与 install 和 update 命令的关系
当vendor目录不存在的时候,在运行composer install时检查会先检查composer.lock里查询相应的本版的包并下载下来;composer update则是先读取composer.json文件然后composer.lock文件,当json文件中的版本与远程仓库中的指定版本发生了变化则会拉取远程仓库中指定版本的最新版本,例如6.2为当前版本,远程有6.9和7.3版本,则会拉取6.9当前指定版本的最新版本
composer删除相应开发包
1)方法一:以移除“phpunit/phpunit”开发包为例
composer remove phpunit/phpunit
2)方法二:
在composer.json文件中require的json下删除相应的开发包然后执行composer update命令即可
如何在开发环境和部署环境下载不同开发包
在开发与测试阶段引用不同的开发包,以phpunit/phpunit包为例
1)在本地环境中下载测试的开发包使用以下命令
composer require --dev phpunit/phpunit
2)在生产环境中不使用测试的开发包使用以下命令会跳过dev的开发包
composer install --no-dev
使用 Composer dumpautoload 生成自动加载文件
使用场景:
由于开发项目的使用会使用很多第三方的开发包,当引用过多的第三方开发包的使用有的类在vendor\composer目录下自动加载会存在找不到的情况,这时候重新运行下composer dump-autoload命令会重新生成自动加载的所有文件
用法:
composer dump-autoload
通过composer create-project 创建新的项目
1)以laravel项目为例,创建一个当前最新的laravel项目并命名项目名称为blog
composer create-project laravel/laravel blog
2)下载指定版本的最新laravel项目,并命名为blog
composer create-project --prefer-dist laravel/laravel blog "6.*"
开发包的版本号的^号和~号是怎么一回事儿
1)^尖号:在使用composer update时候,会以大版本+1限定最高版本,例如8.2.4版本更新时会以8版本更新不超过8版本的更新最大版本
2)~飘号:在使用composer update时候,会以中间版本+1限定最高版本,例如8.2.4版本更新时会以8.2版本更新不超过8.2版本的更新最大版本
如何使用 composer 第三方开发包的功能
这里以安装使用monolog/monolog为例
一般关于monolog包的使用文档会在github说明
<?php
//1、引入自动加载类
require 'vendor/autoload.php';
//2、使用Monolog核心文件
use Monolog\Logger;
use Monolog\Handler\StreamHandler;
// create a log channel
$log = new Logger('name');
//3、指定日志存放位置
$log->pushHandler(new StreamHandler('v_lysvliu.log', Logger::WARNING));
// add records to the log
//4、打印日志信息
$log->warning('Foo');
$log->error('Bar');
echo "Ok";
composer autoload 自动加载初探
在vendor/autoload.php文件中
<?php
// autoload.php @generated by Composer
//1、引入autoload_real.php文件
require_once __DIR__ . '/composer/autoload_real.php';
//2、放回一个getLoader获取到的自动加载器
return ComposerAutoloaderInit54524fc0d832d6a2ccb881dad75e0855::getLoader();
/composer/autoload_real.php核心代码,根据psr4规则
$map = require __DIR__ . '/autoload_namespaces.php';
foreach ($map as $namespace => $path) {
$loader->set($namespace, $path);
}
$map = require __DIR__ . '/autoload_psr4.php';
foreach ($map as $namespace => $path) {
$loader->setPsr4($namespace, $path);
}
$classMap = require __DIR__ . '/autoload_classmap.php';
if ($classMap) {
$loader->addClassMap($classMap);
}
以use Monolog\Logger;文件自动加载为例:
自动加载器会在vendor\composer\autoload_psr4.php文件下找到’Monolog\’ => array($vendorDir . ‘/monolog/monolog/src/Monolog’),在空间路径后拼接Logger类文件从而找到该类,从而可以使用new的方式使用该对象;
在vendor\monolog\monolog下也有composer.json文件,通过该文件的autoload自动加载机制会同步到vendor\composer\autoload_psr4.php的数组中,当vendor\composer\autoload_psr4.php文件数组中没有存在某一个包的自动加载机制是可以通过composer dump-autoload来更新到vendor\composer\autoload_psr4.php文件中
通过 PSR-4 把自定义的 class 文件引入到composer 自动加载中
1)创建一个文件路径为
D:\phpstudy_pro\WWW\composer\app\controllers\UserController.php
2)指定文件的命名空间,遵循psr-4标准
<?php
namespace App\Controllers;
class UserController
{
function __construct()
{
echo "UserController created";
}
}
3)在composer.json中定义需要自动加载的文件目录位置
D:\phpstudy_pro\WWW\composer\composer.json
{
#引入App目录的自动加载
"autoload": {
"psr-4": {"App\\": "app"}
}
}
4) 运行composer dump-autoload命令
会自动将空间路径添加到D:\phpstudy_pro\WWW\composer\vendor\composer\autoload_psr4.php
composer dump-autoload
5)使用自定义的 class 文件UserController.php
<?php
//1、引入自动加载类
require 'vendor/autoload.php';
use App\Controllers\UserController;
$usercontroller = new UserController;
echo "ok";
通过 classmap 将自定义的类文件引入到 composer 项目
采用classmap 方式相对上一种命名空间相对自由,但还是建议少用这用过度灵活的方式
1)创建一个文件路径为
D:\phpstudy_pro\WWW\composer\classmaps\Cat.php
2)指定文件的命名空间,遵循psr-4标准
<?php
class Cat
{
function __construct()
{
echo "Cat";
}
}
3)在composer.json中定义需要自动加载的文件目录位置
D:\phpstudy_pro\WWW\composer\composer.json
{
"autoload": {
"classmap": [
#D:\phpstudy_pro\WWW\composer\classmaps\Cat.php
"classmaps" #根据目录不同而不同
]
}
}
4) 运行composer dump-autoload -o命令
会自动将文件自动加载到D:\phpstudy_pro\WWW\composer\vendor\composer\autoload_classmap.php
composer dump-autoload -o
5)使用自定义的 class 文件Cat.php
<?php
//1、引入自动加载类
require 'vendor/autoload.php';
$cat = new Cat();
echo "ok";
通过 files 加载方式实现全局可调用的函数
1)1)创建一个文件路径为
D:\phpstudy_pro\WWW\composer\app\functions1.php
<?php
function sayhello($name = '',$word = '')
{
return $name.$word;
}
2)在composer.json中定义需要自动加载的文件目录位置
D:\phpstudy_pro\WWW\composer\composer.json
{
"autoload": {
"files": [
"app/functions1.php"
]
}
}
3) 运行composer dump-autoload命令
会自动将文件自动加载到D:\phpstudy_pro\WWW\composer\vendor\composer\autoload_files.php
composer dump-autoload
4)全局调用functions1.php文件下的sayhello()方法
<?php
//1、引入自动加载类
require 'vendor/autoload.php';
sayhello("v_lysvliu","test");
echo "ok";