composer 自动加载
自动加载在根文件中新建composer.json
{
"name": "chloe/php22",
"description": "a lightweight php database framework",
"autoload": {
"psr-4": {
"app\\": "app"
}
}
}
命令行中执行
composer dumpautoload
"psr-4": {
"app\\": "app"
app\\代表命名空间是这个名称的,自动调用app文件夹
也就是说app文件夹中,使用app\\命名空间的类会自动加载
}
具体使用代码如下
<?
//引用自动加载
require __DIR__.DIRECTORY_SEPARATOR.'vendor'.DIRECTORY_SEPARATOR.'autoload.php';
//调用使用的命名空间类
use app\dir1\MyName;
(new MyName())->getOK();
?>
Composer 实战
composer install - 如有 composer.lock 文件,直接安装,否则从 composer.json 安装最新扩展包和依赖;
composer update - 从 composer.json 安装最新扩展包和依赖;
composer update vendor/package - 从 composer.json 或者对应包的配置,并更新到最新;
composer require new/package - 添加安装 new/package, 可以指定版本,如: composer require new/package ~2.5.
composer update 很危险是根据json 都按照到最新
- Composer: PHP 项目的”包”依赖管理工具https://getcomposer.org/
- 这些包,可以是你自己写的, 也可以来自第三方
- 不管来自哪里, composer 都能帮你自动安装好
- 特别是第三方包,还能帮你自动更新到指定版本
本质上, 就是一个文件自动加载器的 Plus+
1. 下载与安装
- 局部安装:
curl -sS https://getcomposer.org/installer | php
全局安装:
- windows:
<https://getcomposer.org/Composer-Setup.exe>
- mac/linux:
# mac全局安装
# 1 先局部安装,
curl -sS https://getcomposer.org/installer | php
# 2 再移动到用户命令目录中,并重命名为composer
sudo mv composer.phar /usr/local/bin/composer
# 测试:查看版本号
composer -V
- windows:
2. composer.json
composer.json: composer 配置文件,可用
composer init
交互式自动创建
- 手工创建
composer.json
:{}
- 执行
composer install
,不会安装任何包,只是借助该文件生成一个vendor
目录 vendor
: 自动加载器,以及加载配置,第三方包都会下载安装到该目录下面autoload.php
: 自动加载器composer目录
: 文件自动加载配置项
3. 自动加载器
主要有二步:
composer.json
: 在autoload
字段中声明依赖的包路径composer dumpautoload
: 将autoload
声明注册到 composer 中
3.1 加载非 class 脚本
- 任务: 自动加载:
config/database.php
,lib/common.php
第一步:
composer.json
中,添加autoload.files
字段{
"autoload": {
"files": ["config/database.php", "lib/common.php"]
}
}
注意:
files
: 必须指定具体文件名(不支持批量设置)第二步:执行:
composer dumpautoload
命令,注册文件路径
在vendor/composer/
中自动生成:autoload_files.php
# vendor/composer/autoload_files.php
// vendor目录
$vendorDir = dirname(__DIR__);
// 项目目录,即应用根目录
$baseDir = dirname($vendorDir);
return array(
'e498698fb6f1e841bf7ec2b12ccada5f' => $baseDir . '/config/database.php',
'95c4794a79ec3bdc221033c3deaf8dd9' => $baseDir . '/lib/common.php',
);
编写测试脚本,如
index.php
require __DIR__ . '/vendor/autoload.php';
// 1. 自定义脚本(非类)
// 不必再使用require手工加载所有依赖文件
// require __DIR__ . '/lib/common.php';
// require __DIR__ . '/config/database.php';
echo DB_HOST, PHP_EOL;
echo currDate(time()) , PHP_EOL;
// localhost
// 2022年12月11日 14时18分43秒
3.2 加载自定义类文件
composer.json
:autoload
中添加classmap
字段{
"autoload": {
"files": ["config/database.php", "lib/common.php"],
"classmap": ["inc/" ]
}
}
// 注: `classmap`支持路径(批量设置),不必遵循任何规范
composer dumpautoload
: 注册自定义 class 类自动生成
vendor/composer/autoload_classmap.php
,内容如下:$vendorDir = dirname(__DIR__);
$baseDir = dirname($vendorDir);
return array(
'Composer\\InstalledVersions' => $vendorDir . '/composer/InstalledVersions.php',
'hello\\Test1' => $baseDir . '/inc/Class1.php',
'hello\\Test2' => $baseDir . '/inc/Class2.php',
);
测试脚本添加以下内容
```php
// 2自定义类文件
// 不必手工加载相关class文档, 直接使用即可
echo hello\Test1::get() . PHP_EOL;
echo hello\Test2::get() . PHP_EOL;
// hello\Test1::get()
// hello\Test2::get()
### 3.3 PSR-4 自动加载规范
- PSR:(Standard Recommendations)PHP PHP FIG 组织制定的推荐标准
- PSR-4 要求
1. 类空间映射到类文件路径
2. 类名与类文件同名
3. 一个类文件中只允许存在一个类
1. `composer.json`, `autoload`,添加`psr-4`字段
```json
{
"autoload": {
"files": ["config/database.php", "lib/common.php"],
"classmap": ["inc/", "src/Base.php"],
"psr-4": {
"app\\": ["app"]
}
}
}
// 1. 键: 命名空间, 值: 命名空间对应的目录,支持批量设置
// 2. 值可以是数组,表示同一空间的类,可以分布在不同的目录下面
// 3. 命名空间不一定和类文件路径完全对应,只需要注册查询规则
composer dumpautoload
,注册遵循 PSR-4 规范的类自动生成
vendor/composer/autoload_psr4.php
,内容如下:$vendorDir = dirname(dirname(__FILE__));
$baseDir = dirname($vendorDir);
return array(
'app\\' => array($baseDir . '/app'),
'Chloe\\Model\\' => array($baseDir . '/src'),
);
测试脚本
index.php
中, 添加以下内容```php
// 3. PSR-4: 类的自动加载
echo Article::index();echo UserModel::getUsers();
---
## 4. 实战: 安装第三方包
第三方"包"查询平台:<https://packagist.org/>
### 4.1 常规包
以某流行的数据库模型类为例:`catfan/medoo`
有二种安装方式
1. 将包名写入`composer.json`的`require`字段中,用`install`安装
2. 直接使用`require`指令,将字段写入与安装同步完成
> 注: 所有第三方包,自动保存在 vendor 目录下统一管理
方法 1: `require`字段 + `install/update`指令
1. `composer.json`添加包`"require": {"catfan/medoo": "2.1.*"}`
```version
2.1.* [2.1,2.2)
2.* [2,3.0)
composer.lock
可锁定第 3 方库版本,先将它删除,安装后会自动生成该文件- 终端执行
composer install
,开始安装require
字段中的包 - 也可通过
composer update
,安装包与更新composer.lock
同步完成
方法 2: composer require 包
,写入配置,下载安装,更新 lock 全部同时完成
- 先将包移除:
composer remove catfan/medoo
,同时会更新composer.json/lock
composer require catfan/medoo
, 一条指令全搞定- 测试脚本
demo2.php
// 测试Medoo\Medoo包 mews/captcha
require __DIR__ . '/vendor/autoload.php';
// 连接数据库
$db = new Medoo\Medoo([
'type'=>'mysql',
'host'=>'localhost',
'database'=>'phpedu',
'username'=>'root',
'password'=>'root'
]);
// $users = $db->select('users', ['id','username','email'], ['id[>=]'=>5,'LIMIT'=>3]);
// debug(): 查看sql语句,并不执行,方便静态检查
$users = $db->debug()->select('users', ['id','username','email'], ['id[>=]'=>5,'LIMIT'=>3]);
echo PHP_EOL;
$users = $db->select('users', ['id','username','email'], ['id[>=]'=>5,'LIMIT'=>3]);
foreach ($users as $user) {
vprintf("%d: %s ( %s )\n", $user);
}
4.2 脚本架
脚手架: 项目的基本目录结构(已包含了包依赖管理功能)
以安装
ThinkPHP
框架脚手为例:# 创建基于ThinkPHP的项目,项目目录:blog
composer create-project topthink/think blog
# 默认下载最新稳定版本,可指定版本号,如6.0.*
composer create-project topthink/think blog 6.0.*
只需要
ThinkPHP
框架源码(用于更新)# 安装tp源码
composer require topthink/framework
# 移除tp源码
composer remove topthink/framework
php.edu/1212/blog/public/
,可看到框架启动界面
更多指令:https://docs.phpcomposer.com/03-cli.html
gregwar/captcha
google/recaptcha