定制 kode/tools 二次开发

按需修改功能、优化性能、对接业务系统,提供一站式技术支持

邮箱:yvsm@zunyunkeji.com | QQ:316430983 | 微信:yvsm316

kode/tools

最新稳定版本:1.1.6

Composer 安装命令:

composer require kode/tools

包简介

PHP8.3+通用工具包,包含数组处理、字符串处理、时间处理、加解密、IP、地理计算、Curl、二维码生成、全局辅助方法等功能

README 文档

README

简介

这是一个基于PHP8.3+特性开发的模块化通用工具包,提供了数组处理、字符串处理、时间处理、加解密、消息体、IP地址处理、地理计算、全局辅助方法等功能。支持对象和静态两种调用方式,兼容进程和协程环境。

核心特性

模块化架构

工具包采用清晰的模块化架构,每个模块专注于特定领域的功能:

├── src/
│   ├── Message/          // 消息体核心
│   │   ├── Message.php   // 消息体主类(链式调用)
│   │   ├── CodeMap.php   // 状态码映射配置类
│   ├── Crypto/           // 加解密核心
│   │   ├── Crypto.php    // 加解密主类(命名简洁)
│   │   ├── Contracts/    // 接口定义
│   │   │   ├── EncryptInterface.php
│   │   │   ├── DecryptInterface.php
│   ├── Array/            // 数组处理核心
│   │   ├── Arr.php       // 数组处理主类
│   ├── String/           // 字符串处理核心
│   │   ├── Str.php       // 字符串处理主类
│   ├── Time/             // 时间处理核心
│   │   ├── Time.php      // 时间处理主类
│   ├── Math/             // 数学计算核心
│   │   ├── Math.php      // 数学计算主类
│   ├── Geo/              // 地理位置核心
│   │   ├── Geo.php       // 地理位置主类
│   ├── Ip/               // IP地址处理核心
│   │   ├── Ip.php        // IP地址处理主类
│   ├── Curl/             // HTTP请求核心
│   │   ├── Curl.php      // HTTP请求主类
│   │   ├── Response.php  // 响应处理类
│   │   ├── Exception/    // 异常类
│   │   │   ├── CurlException.php
│   │   │   ├── ClientException.php
│   │   │   └── ServerException.php
│   ├── Qrcode/           // 二维码生成核心
│   │   ├── Qrcode.php    // 二维码主类
│   │   ├── Color.php     // 颜色类
│   │   ├── LogoPosition.php   // Logo位置枚举
│   │   ├── RoundBlockSizeMode.php // 圆角模式枚举
│   │   └── EncodingMode.php     // 编码模式枚举
│   ├── Helper/           // 全局辅助函数
│   │   ├── helper.php    // 全局辅助函数文件
├── composer.json         // Composer配置
├── README.md             // 使用文档

数组处理模块

核心方法

方法名 功能描述 调用示例
first() 获取第一个元素 Arr::first([1, 2, 3])
last() 获取最后一个元素 Arr::last([1, 2, 3])
find() 查找满足条件的元素 Arr::find([1, 2, 3], fn($n) => $n > 1)
tree() 数组转树形结构 Arr::tree($list, 'id', 'pid')
list() 树形结构转数组 Arr::list($tree)
deepMerge() 深度合并数组 Arr::deepMerge($arr1, $arr2)

特性

  • ✅ 树形结构转换(数组转树、树转数组)
  • ✅ 层级结构转换
  • ✅ 路径结构转换
  • ✅ 常用数组操作(get/set/has/only/except)
  • ✅ 数组深度合并
  • ✅ 多维数组分组
  • ✅ 多维数组统计(count/sum/avg/max/min)
  • ✅ 多维数组转JSON/JSON转数组
  • ✅ 非递归算法,支持大数据量
  • ✅ 支持点语法和数组嵌套键访问

字符串处理模块

核心方法

方法名 功能描述 调用示例
maskPhone() 手机号脱敏 Str::maskPhone('13800138000')
maskEmail() 邮箱脱敏 Str::maskEmail('user@example.com')
camel() 转驼峰命名 Str::camel('hello_world')
snake() 转蛇形命名 Str::snake('helloWorld')
toBase64() 转Base64编码 Str::toBase64('hello')
fromBase64() Base64解码 Str::fromBase64('aGVsbG8=')

特性

  • ✅ 随机字符串生成
  • ✅ UUID生成
  • ✅ 命名转换(驼峰、蛇形、大驼峰)
  • ✅ 字符串转义和反转义
  • ✅ 字符串修剪
  • ✅ 字符串脱敏(手机号、身份证号、邮箱、银行卡号、车牌号、姓名)
  • ✅ 字符串验证(手机号、身份证号、邮箱、车牌号、银行卡号)
  • ✅ 收货地址解析
  • ✅ 字符串格式化和转换
  • ✅ 字符串相似度比较
  • ✅ 多分隔符字符串分割

时间处理模块

核心方法

方法名 功能描述 调用示例
format() 格式化时间 Time::format(time(), 'Y-m-d')
now() 获取当前时间 Time::now()
today() 获取今天日期 Time::today()
yesterday() 获取昨天日期 Time::yesterday()
tomorrow() 获取明天日期 Time::tomorrow()
add() 时间加法 Time::add(time(), 3600)
sub() 时间减法 Time::sub(time(), 3600)
diff() 时间差 Time::diff(time(), time() - 3600)
diffForHumans() 人性化时间差 Time::diffForHumans(time() - 3600)
weekStart() 本周开始时间 Time::weekStart()
weekEnd() 本周结束时间 Time::weekEnd()
monthStart() 本月开始时间 Time::monthStart()
monthEnd() 本月结束时间 Time::monthEnd()

特性

  • ✅ 时间格式化
  • ✅ 时间计算(加法、减法、差值)
  • ✅ 常用时间获取(当前时间、今天、昨天、明天)
  • ✅ 时区支持
  • ✅ 人性化时间显示、日期范围计算

加解密模块

核心方法

方法名 功能描述 调用示例
cryptoMd5() MD5加密(支持加盐) Crypto::cryptoMd5('123456', 'salt')
cryptoPasswordHash() 密码哈希 Crypto::cryptoPasswordHash('123456')
cryptoPasswordVerify() 密码验证 Crypto::cryptoPasswordVerify('123456', $hash)
cryptoSslEncrypt() SSL对称加密 Crypto::cryptoSslEncrypt('data', $key)
cryptoSslDecrypt() SSL对称解密 Crypto::cryptoSslDecrypt($encrypted, $key)

特性

  • ✅ MD5加密(支持加盐)
  • ✅ 密码哈希(基于PHP原生password_hash)
  • ✅ SSL对称加密(AES-256-GCM)
  • ✅ HMAC签名(支持多种算法)
  • ✅ 双模式调用:实例调用 + 静态调用
  • ✅ 符合安全最佳实践
  • ✅ PHP8.3+只读属性确保配置安全

代码生成模块

  • ✅ 订单号生成(时间戳+随机数)
  • ✅ 邀请码生成(自定义长度和字符集)
  • ✅ URL安全码生成(Base64URL编码)
  • ✅ 注册码生成(支持分段显示)
  • ✅ 线程安全的随机数生成(random_int)

数学计算模块

核心方法

方法名 功能描述 调用示例
add() 高精度加法 Math::add('1.1', '2.2')
sub() 高精度减法 Math::sub('3.3', '1.1')
mul() 高精度乘法 Math::mul('2.5', '4')
div() 高精度除法 Math::div('10', '3')
avg() 平均数 Math::avg([1, 2, 3, 4, 5])
median() 中位数 Math::median([1, 2, 3, 4, 5])
discount() 计算折扣价 Math::discount('100', '0.2')
tax() 计算税额 Math::tax('100', '0.13')

特性

  • ✅ 高精度计算(使用bcmath扩展)
  • ✅ 支持金融计算(折扣、税费、利息)
  • ✅ 支持统计分析(平均数、中位数、标准差)
  • ✅ 支持幂运算、平方根等数学操作
  • ✅ 结果保留任意小数位数
  • ✅ 兼容PHP8.3+特性

地理位置模块

核心方法

方法名 功能描述 调用示例
distance() 计算两点距离 Geo::distance(39.9042, 116.4074, 31.2304, 121.4737)
isValidCoordinate() 验证坐标 Geo::isValidCoordinate(39.9042, 116.4074)
wgs84ToGcj02() WGS84转GCJ02 Geo::wgs84ToGcj02(39.9042, 116.4074)
gcj02ToBd09() GCJ02转BD09 Geo::gcj02ToBd09(39.9042, 116.4074)
getBearing() 计算方位角 Geo::getBearing(39.9042, 116.4074, 31.2304, 121.4737)
getMidpoint() 计算中点坐标 Geo::getMidpoint(39.9042, 116.4074, 31.2304, 121.4737)

特性

  • ✅ 使用Haversine公式计算距离
  • ✅ 支持多种距离单位(公里、英里、米)
  • ✅ 支持坐标转换(WGS84/GCJ02/BD09)
  • ✅ 支持方位角和中点计算
  • ✅ 高精度计算(保留6位小数)
  • ✅ 兼容PHP8.3+特性
  • ✅ 高精度数学计算(加减乘除、取模、幂运算、平方根)
  • ✅ 四舍五入、向上取整、向下取整
  • ✅ 数值比较和格式化
  • ✅ 解决浮点数精度丢失问题
  • ✅ 支持PHP8.3+类型声明
  • ✅ 线程安全的初始化模式
  • ✅ 高精度计算、金融计算、统计分析

消息体模块

核心方法

方法名 功能描述 调用示例
success() 成功响应 Message::success($data)
error() 错误响应 Message::error('错误信息')
warning() 警告响应 Message::warning('警告信息')
info() 信息响应 Message::info('提示信息')
setCode() 设置状态码 Message::success()->setCode(20001)
setMsg() 设置消息 Message::success()->setMsg('操作成功')
setData() 设置数据 Message::success()->setData($data)
setPage() 设置分页 Message::success()->setPage($page)
toJson() 输出JSON Message::success()->toJson()

方法详情

Message::success() - 成功响应

快速构建成功响应,默认状态码200。

// 基础用法
$res = Message::success()->result();
// ['code' => 200, 'msg' => '操作成功']

// 带数据的成功响应
$res = Message::success(['id' => 123, 'name' => '测试'])->result();
// ['code' => 200, 'msg' => '操作成功', 'data' => ['id' => 123, 'name' => '测试']]

// 自定义消息
$res = Message::success()->msg('创建成功')->result();
// ['code' => 200, 'msg' => '创建成功']

Message::error() - 错误响应

快速构建错误响应,默认状态码400。

// 基础用法
$res = Message::error()->result();
// ['code' => 400, 'msg' => '操作失败']

// 自定义错误信息
$res = Message::error('参数验证失败')->result();
// ['code' => 400, 'msg' => '参数验证失败']

// 自定义错误码和信息
$res = Message::error('Token失效')->setCode(300000)->result();
// ['code' => 300000, 'msg' => 'Token失效']

Message::warning() - 警告响应

快速构建警告响应,默认状态码400。

// 基础用法
$res = Message::warning()->result();
// ['code' => 400, 'msg' => '操作警告']

// 自定义警告信息
$res = Message::warning('数据将被覆盖')->result();
// ['code' => 400, 'msg' => '数据将被覆盖']

Message::info() - 信息响应

快速构建信息响应,默认状态码200。

// 基础用法
$res = Message::info()->result();
// ['code' => 200, 'msg' => '提示信息']

// 自定义提示信息
$res = Message::info('操作已接受,处理中')->result();
// ['code' => 200, 'msg' => '操作已接受,处理中']

setCode() - 设置状态码

自定义响应状态码,支持基础码(200/400/500)和6位业务码。

// 设置基础状态码
$res = Message::success()->setCode(201)->result();
// ['code' => 201, 'msg' => '操作成功']

// 设置业务状态码
$res = Message::error()->setCode(800000)->result();
// ['code' => 800000, 'msg' => '操作失败']

setMsg() - 设置消息

自定义响应消息文本。

// 基础用法
$res = Message::success()->setMsg('创建成功')->result();
// ['code' => 200, 'msg' => '创建成功']

// 动态消息
$res = Message::error()->setMsg('用户ID不存在')->result();
// ['code' => 400, 'msg' => '用户ID不存在']

setData() - 设置数据

设置业务数据内容。

// 基础用法
$res = Message::success()->setData(['id' => 123, 'name' => '测试'])->result();
// ['code' => 200, 'msg' => '操作成功', 'data' => ['id' => 123, 'name' => '测试']]

// 空数据
$res = Message::success()->setData(null)->result();
// ['code' => 200, 'msg' => '操作成功', 'data' => null]

setPage() - 设置分页

设置分页信息。

// 基础用法
$res = Message::success()->setPage(['page' => 1, 'size' => 20, 'total' => 100])->result();
// ['code' => 200, 'msg' => '操作成功', 'page' => ['page' => 1, 'size' => 20, 'total' => 100]]

toJson() - 输出JSON

直接输出JSON格式响应。

// 基础用法
echo Message::success()->toJson();
// 输出: {"code":200,"msg":"操作成功"}

// 带数据的JSON
echo Message::success(['id' => 123])->toJson();
// 输出: {"code":200,"msg":"操作成功","data":{"id":123}}

特性

  • ✅ 双模式链式调用:实例链式 + 静态链式
  • ✅ 完整的状态码管理(200/400/500基础码 + 6位业务码)
  • ✅ 灵活的字段扩展和映射
  • ✅ 内置分页支持
  • ✅ 支持JSON直接输出
  • ✅ PHP8.3+特性优化:只读属性、类型细化、nullsafe运算符
  • ✅ 线程安全的初始化模式

Curl模块

核心方法

方法名 功能描述 调用示例
get() GET请求 Curl::get('https://api.example.com')->send()
post() POST请求 Curl::post('https://api.example.com', $data)->send()
put() PUT请求 Curl::put('https://api.example.com/1', $data)->send()
delete() DELETE请求 Curl::delete('https://api.example.com/1')->send()
patch() PATCH请求 Curl::patch('https://api.example.com/1', $data)->send()
head() HEAD请求 Curl::head('https://api.example.com')->send()
options() OPTIONS请求 Curl::options('https://api.example.com')->send()
multi() 并发请求 Curl::multi()->add()->execute()
retry() 自动重试 Curl::get()->retry(3, 2.0)
body() 获取响应体 $response->body()
json() 获取JSON $response->json()
header() 获取响应头 $response->header('Content-Type')
statusCode() 获取状态码 $response->statusCode()

特性

  • ✅ 支持HTTP/HTTPS协议
  • ✅ 支持GET/POST/PUT/DELETE/PATCH/HEAD/OPTIONS请求
  • ✅ 支持请求超时设置
  • ✅ 支持请求头设置
  • ✅ 支持请求参数设置
  • ✅ 支持响应状态码、响应头、响应体获取
  • ✅ 支持异常处理
  • ✅ 支持多种HTTP方法(GET/POST/PUT/PATCH/DELETE)
  • ✅ 支持多种内容类型(JSON/form/multipart)
  • ✅ 灵活的请求选项配置
  • ✅ 响应处理和错误处理
  • ✅ 并发请求支持
  • ✅ PHP 8.5+持久化句柄支持(curl_share_init_persistent)
  • ✅ 重试机制和超时控制
  • ✅ SSL验证和代理支持
  • ✅ 双模式调用:实例调用 + 静态调用

Qrcode模块

核心方法

方法名 功能描述 调用示例
create() 创建二维码 Qr::create('Hello World')
size() 设置大小 Qr::create('Hello')->size(300)
margin() 设置边距 Qr::create('Hello')->margin(20)
foregroundColor() 设置前景色 Qr::create('Hello')->foregroundColor(255, 0, 0)
backgroundColor() 设置背景色 Qr::create('Hello')->backgroundColor(255, 255, 255)
errorCorrectionLevel() 设置错误纠正级别 Qr::create('Hello')->errorCorrectionLevel(5)
logo() 添加Logo Qr::create('Hello')->logo('path/to/logo.png')
label() 添加标签 Qr::create('Hello')->label('标签文字')
save() 保存为文件 Qr::create('Hello')->save('qrcode.png')
toString() 输出图片数据 $qr->toString()
toDataUri() 生成Base64编码 $qr->toDataUri()
asSvg() 输出SVG格式 Qr::create('Hello')->asSvg()
asWebP() 输出WebP格式 Qr::create('Hello')->asWebP()
asEps() 输出EPS格式 Qr::create('Hello')->asEps()
url() URL二维码 Qr::url('https://example.com')
wifi() WiFi二维码 Qr::wifi('MyWiFi', 'password', 'wpa')
email() 邮件二维码 Qr::email('user@example.com', '主题', '内容')
phone() 电话二维码 Qr::phone('13800138000')
sms() 短信二维码 Qr::sms('13800138000', '短信内容')
geo() 位置二维码 Qr::geo(39.9042, 116.4074)
bitcoin() 比特币二维码 Qr::bitcoin('address', 0.5)
event() 日历事件二维码 Qr::event('标题', '开始时间', '结束时间', '地点')

特性

  • ✅ 支持多种二维码大小
  • ✅ 支持多种错误纠正级别
  • ✅ 支持添加Logo
  • ✅ 支持自定义颜色
  • ✅ 支持多种输出格式(PNG、SVG、EPS)
  • ✅ 支持Base64编码输出
  • ✅ 基础二维码生成(文本、URL)
  • ✅ 多种样式定制:
    • ✅ 圆角点样式(圆形、圆角方形)
    • ✅ 渐变颜色支持(水平/垂直/对角线方向)
    • ✅ 自定义前景/背景颜色
    • ✅ Logo嵌入支持
    • ✅ 标签文字支持
  • ✅ 多种输出格式(PNG/SVG/WebP/EPS)
  • ✅ 多种数据类型支持:
    • ✅ URL二维码
    • ✅ WiFi二维码
    • ✅ 邮件二维码
    • ✅ 电话二维码
    • ✅ 短信二维码
    • ✅ 名片二维码(vCard)
    • ✅ 位置二维码
    • ✅ 比特币二维码
    • ✅ 日历事件二维码
  • ✅ 多种错误纠正级别(L/M/Q/H)
  • ✅ PHP8.3+特性优化:只读属性、类型声明
  • ✅ 双模式调用:实例调用 + 静态调用
  • ✅ 全局助手函数支持

Helper::全局助手函数

  • ✅ 简化调用方式,无需实例化
  • ✅ 自动加载,无需手动导入
  • ✅ 支持所有核心功能的快捷调用

安装

1. Composer 安装

composer require kode/tools

2. 手动安装

将 src/ 目录下的文件复制到你的项目中,并配置自动加载。

模块结构建议

当前架构的优势

当前的模块化架构具有以下优势:

  1. 职责单一:每个模块专注于特定领域的功能,代码更清晰,维护更方便
  2. 解耦性高:模块之间依赖关系明确,便于独立测试和升级
  3. 可扩展性强:可以轻松添加新的模块或扩展现有模块
  4. 性能优化:按需加载,减少不必要的资源占用
  5. 团队协作:多人开发时可以并行处理不同模块

最佳实践

  1. 保持模块独立性:每个模块应尽量减少对其他模块的依赖
  2. 统一命名规范:所有模块采用一致的命名方式和编码风格
  3. 文档化:为每个模块和方法编写清晰的文档
  4. 测试覆盖:为每个模块编写单元测试
  5. 版本控制:定期更新和维护模块版本

数组处理模块使用示例

数组处理模块提供了丰富的数组操作功能,支持PHP 8.4+原生数组函数,自动根据PHP版本选择最优实现。

PHP 8.4兼容性说明

数组处理模块会自动检测PHP版本,在PHP 8.4+环境下使用原生数组函数以获得最佳性能:

  • array_first() - 获取数组第一个元素
  • array_last() - 获取数组最后一个元素
  • array_find() - 查找满足条件的元素
  • array_find_key() - 查找满足条件的键名
  • array_any() - 检查是否存在满足条件的元素
  • array_all() - 检查是否所有元素都满足条件

在PHP 8.4以下版本,模块会使用兼容的实现,确保代码在不同PHP版本下都能正常运行。

树形结构转换

tree() - 数组转树形结构

use Kode\Array\Arr;

// 数组转树形结构
$flatArray = [
    ['id' => 1, 'name' => '部门1', 'parent_id' => 0],
    ['id' => 2, 'name' => '部门2', 'parent_id' => 1],
    ['id' => 3, 'name' => '部门3', 'parent_id' => 1],
    ['id' => 4, 'name' => '部门4', 'parent_id' => 2]
];

$tree = Arr::tree($flatArray, 'id', 'parent_id', 'children');
// 输出:
// [
//     [
//         'id' => 1,
//         'name' => '部门1',
//         'parent_id' => 0,
//         'children' => [
//             [
//                 'id' => 2,
//                 'name' => '部门2',
//                 'parent_id' => 1,
//                 'children' => [
//                     ['id' => 4, 'name' => '部门4', 'parent_id' => 2, 'children' => []]
//                 ]
//             ],
//             [
//                 'id' => 3,
//                 'name' => '部门3',
//                 'parent_id' => 1,
//                 'children' => []
//             ]
//         ]
//     ]
// ]

#### list() - 树形结构转数组

// 树形结构转数组
$flat = Arr::list($tree, 'children');

#### level() - 数组转层级结构

// 数组转层级结构
$level = Arr::level($flatArray, 'id', 'parent_id', 'level');
// 输出:
// [
//     ['id' => 1, 'name' => '部门1', 'parent_id' => 0, 'level' => 1],
//     ['id' => 2, 'name' => '部门2', 'parent_id' => 1, 'level' => 2],
//     ['id' => 3, 'name' => '部门3', 'parent_id' => 1, 'level' => 2],
//     ['id' => 4, 'name' => '部门4', 'parent_id' => 2, 'level' => 3]
// ]

// 数组转路径结构
$path = Arr::path($flatArray, 'id', 'parent_id', 'name', 'path', '/');
// 输出:
// [
//     ['id' => 1, 'name' => '部门1', 'parent_id' => 0, 'path' => '部门1'],
//     ['id' => 2, 'name' => '部门2', 'parent_id' => 1, 'path' => '部门1/部门2'],
//     ['id' => 3, 'name' => '部门3', 'parent_id' => 1, 'path' => '部门1/部门3'],
//     ['id' => 4, 'name' => '部门4', 'parent_id' => 2, 'path' => '部门1/部门2/部门4']
// ]

数组访问和操作

deepMerge() - 数组深度合并

use Kode\Array\Arr;

// 数组深度合并
$array1 = [
    'user' => [
        'name' => '张三',
        'age' => 25
    ],
    'settings' => [
        'theme' => 'dark'
    ]
];

$array2 = [
    'user' => [
        'age' => 26,
        'email' => 'user@example.com'
    ],
    'settings' => [
        'language' => 'zh-CN'
    ]
];

$merged = Arr::deepMerge($array1, $array2);
// 输出:
// [
//     'user' => [
//         'name' => '张三',
//         'age' => 26,
//         'email' => 'user@example.com'
//     ],
//     'settings' => [
//         'theme' => 'dark',
//         'language' => 'zh-CN'
//     ]
// ]

#### get() - 数组获取值(支持点语法)

// 数组获取值(支持点语法)
$value = Arr::get($array1, 'user.name'); // '张三'
$value = Arr::get($array1, ['user', 'age']); // 25
$value = Arr::get($array1, 'user.email', 'default@example.com'); // 'default@example.com'

#### set() - 数组设置值

// 数组设置值
$result = Arr::set($array1, 'user.age', 26);

#### has() - 数组判断是否存在键

// 数组判断是否存在键
$exists = Arr::has($array1, 'user.name'); // true
$exists = Arr::has($array1, 'user.email'); // false

#### only() - 数组仅保留指定键

// 数组仅保留指定键
$only = Arr::only($array1, ['user.name', 'user.age']);
// 输出: ['user' => ['name' => '张三', 'age' => 25]]

#### except() - 数组排除指定键

// 数组排除指定键
$except = Arr::except($array1, ['settings']);
// 输出: ['user' => ['name' => '张三', 'age' => 25]]

多维数组统计

group() - 多维数组分组

use Kode\Array\Arr;

$flatArray = [
    ['id' => 1, 'name' => '部门1', 'parent_id' => 0],
    ['id' => 2, 'name' => '部门2', 'parent_id' => 1],
    ['id' => 3, 'name' => '部门3', 'parent_id' => 1],
    ['id' => 4, 'name' => '部门4', 'parent_id' => 2]
];

// 多维数组分组
$grouped = Arr::group($flatArray, 'parent_id');
// 输出:
// [
//     0 => [['id' => 1, 'name' => '部门1', 'parent_id' => 0]],
//     1 => [
//         ['id' => 2, 'name' => '部门2', 'parent_id' => 1],
//         ['id' => 3, 'name' => '部门3', 'parent_id' => 1]
//     ],
//     2 => [['id' => 4, 'name' => '部门4', 'parent_id' => 2]]
// ]

#### count() - 多维数组统计

// 多维数组统计
$count = Arr::count($flatArray, 'parent_id');
// 输出: [0 => 1, 1 => 2, 2 => 1]

#### sum() - 多维数组求和

// 多维数组求和
$sum = Arr::sum($flatArray, 'id'); // 10

#### avg() - 多维数组求平均值

// 多维数组求平均值
$avg = Arr::avg($flatArray, 'id'); // 2.5

#### min() - 多维数组求最小值

// 多维数组求最小值
$min = Arr::min($flatArray, 'id'); // 1

PHP 8.4+数组函数

Arr::first() - 数组首元素

use Kode\Array\Arr;

// 数组首元素(PHP 8.4+使用原生array_first)
$first = Arr::first([1, 2, 3, 4, 5]); // 1
$first = Arr::first([]); // null

#### last() - 数组尾元素

// 数组尾元素(PHP 8.4+使用原生array_last)
$last = Arr::last([1, 2, 3, 4, 5]); // 5
$last = Arr::last([]); // null

#### find() - 查找满足条件的元素

// 查找满足条件的元素(PHP 8.4+使用原生array_find)
$found = Arr::find([1, 2, 3, 4, 5], fn($n) => $n > 2); // 3
$found = Arr::find([1, 2, 3, 4, 5], fn($n) => $n > 10); // null

#### findKey() - 查找满足条件的键名

// 查找满足条件的键名(PHP 8.4+使用原生array_find_key)
$foundKey = Arr::findKey(['a' => 1, 'b' => 2, 'c' => 3], fn($n) => $n > 1); // 'b'
$foundKey = Arr::findKey(['a' => 1, 'b' => 2, 'c' => 3], fn($n) => $n > 10); // null

#### any() - 检查是否存在满足条件的元素

// 检查是否存在满足条件的元素(PHP 8.4+使用原生array_any)
$hasAny = Arr::any([1, 2, 3, 4, 5], fn($n) => $n > 3); // true
$hasAny = Arr::any([1, 2, 3, 4, 5], fn($n) => $n > 10); // false

#### all() - 检查是否所有元素都满足条件

// 检查是否所有元素都满足条件(PHP 8.4+使用原生array_all)
$allMatch = Arr::all([1, 2, 3, 4, 5], fn($n) => $n > 0); // true
$allMatch = Arr::all([1, 2, 3, 4, 5], fn($n) => $n > 2); // false

数组查找和判断

use Kode\Array\Arr;

// 数组映射
$mapped = Arr::map([1, 2, 3, 4, 5], fn($n) => $n * 2); // [2, 4, 6, 8, 10]

// 数组过滤
$filtered = Arr::filter([1, 2, 3, 4, 5], fn($n) => $n > 2); // [3, 4, 5]
$filtered = Arr::filter([1, 2, 0, null, false]); // [1, 2](过滤空值)

// 数组归约
$sum = Arr::reduce([1, 2, 3, 4, 5], fn($carry, $n) => $carry + $n, 0); // 15

// 检查是否存在满足条件的元素(别名方法)
$hasSome = Arr::some([1, 2, 3, 4, 5], fn($n) => $n > 3); // true

// 检查是否所有元素都满足条件(别名方法)
$allMatch = Arr::every([1, 2, 3, 4, 5], fn($n) => $n > 0); // true

// 数组是否包含指定元素
$contains = Arr::contains([1, 2, 3, 4, 5], 3); // true
$contains = Arr::contains([1, 2, 3, 4, 5], '3', false); // true(非严格比较)
$contains = Arr::contains([1, 2, 3, 4, 5], '3', true); // false(严格比较)

// 数组是否包含指定键名
$containsKey = Arr::containsKey(['a' => 1, 'b' => 2], 'a'); // true

// 数组是否为空
$isEmpty = Arr::isEmpty([]); // true
$isEmpty = Arr::isEmpty([1, 2, 3]); // false

// 数组是否为关联数组
$isAssoc = Arr::isAssoc(['a' => 1, 'b' => 2]); // true
$isAssoc = Arr::isAssoc([1, 2, 3]); // false

// 数组是否为索引数组
$isIndexed = Arr::isIndexed([1, 2, 3]); // true
$isIndexed = Arr::isIndexed(['a' => 1, 'b' => 2]); // false

数组排序

use Kode\Array\Arr;

$users = [
    ['id' => 3, 'name' => '张三', 'age' => 25],
    ['id' => 1, 'name' => '李四', 'age' => 30],
    ['id' => 2, 'name' => '王五', 'age' => 28]
];

// 数组排序(升序)
$sorted = Arr::sort($users, 'age', 'asc');
// 输出: [['id' => 3, 'name' => '张三', 'age' => 25], ['id' => 2, 'name' => '王五', 'age' => 28], ['id' => 1, 'name' => '李四', 'age' => 30]]

// 数组排序(降序)
$sorted = Arr::sort($users, 'age', 'desc');
// 输出: [['id' => 1, 'name' => '李四', 'age' => 30], ['id' => 2, 'name' => '王五', 'age' => 28], ['id' => 3, 'name' => '张三', 'age' => 25]]

// 多维数组排序
$multiSorted = Arr::multiSort($users, ['age', 'id'], ['asc', 'desc']);
// 先按age升序,age相同时按id降序

// 数组反转
$reversed = Arr::reverse([1, 2, 3, 4, 5]); // [5, 4, 3, 2, 1]
$reversed = Arr::reverse(['a' => 1, 'b' => 2], true); // ['b' => 2, 'a' => 1](保留键名)

// 数组打乱
$shuffled = Arr::shuffle([1, 2, 3, 4, 5]); // 随机打乱顺序

数组去重

use Kode\Array\Arr;

// 数组去重
$unique = Arr::unique([1, 2, 2, 3, 3, 3, 4, 4, 4, 4]); // [1, 2, 3, 4]
$unique = Arr::unique([1, '1', 2, '2'], true); // [1, '1', 2, '2](严格比较)
$unique = Arr::unique([1, '1', 2, '2'], false); // [1, 2](非严格比较)

// 多维数组去重
$users = [
    ['id' => 1, 'name' => '张三'],
    ['id' => 2, 'name' => '李四'],
    ['id' => 1, 'name' => '张三']
];
$unique = Arr::multiUnique($users, 'id');
// 输出: [['id' => 1, 'name' => '张三'], ['id' => 2, 'name' => '李四']]

数组分页和切片

use Kode\Array\Arr;

// 数组分页
$array = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12];
$page1 = Arr::paginate($array, 1, 5); // [1, 2, 3, 4, 5]
$page2 = Arr::paginate($array, 2, 5); // [6, 7, 8, 9, 10]
$page3 = Arr::paginate($array, 3, 5); // [11, 12]

// 数组切片
$sliced = Arr::slice([1, 2, 3, 4, 5], 1, 3); // [2, 3, 4]
$sliced = Arr::slice(['a' => 1, 'b' => 2, 'c' => 3, 'd' => 4], 1, 2, true); // ['b' => 2, 'c' => 3](保留键名)

// 数组分割
$chunked = Arr::chunk([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 3);
// 输出: [[1, 2, 3], [4, 5, 6], [7, 8, 9], [10]]

数组合并和差集

use Kode\Array\Arr;

// 数组合并
$merged = Arr::merge([1, 2, 3], [4, 5, 6]); // [1, 2, 3, 4, 5, 6]

// 数组合并(保留键名)
$merged = Arr::mergeRecursive(['a' => 1], ['b' => 2]); // ['a' => 1, 'b' => 2]

// 数组差集
$diff = Arr::diff([1, 2, 3, 4, 5], [2, 4]); // [1, 3, 5]

// 数组差集(带键名)
$diff = Arr::diffKey(['a' => 1, 'b' => 2, 'c' => 3], ['b' => 2]); // ['a' => 1, 'c' => 3]

// 数组交集
$intersect = Arr::intersect([1, 2, 3, 4, 5], [2, 4, 6]); // [2, 4]

// 数组交集(带键名)
$intersect = Arr::intersectKey(['a' => 1, 'b' => 2, 'c' => 3], ['b' => 2, 'c' => 4]); // ['b' => 2, 'c' => 3]

数组转换

use Kode\Array\Arr;

// 多维数组转JSON
$json = Arr::toJson(['name' => '张三', 'age' => 25]); // '{"name":"张三","age":25}'

// JSON转多维数组
$array = Arr::fromJson('{"name":"张三","age":25}'); // ['name' => '张三', 'age' => 25]

// 数组扁平化
$flattened = Arr::flatten([1, [2, [3, [4, 5]]]]); // [1, 2, 3, 4, 5]

// 数组键名
$keys = Arr::keys(['a' => 1, 'b' => 2, 'c' => 3]); // ['a', 'b', 'c']

// 数组值
$values = Arr::values(['a' => 1, 'b' => 2, 'c' => 3]); // [1, 2, 3]

// 数组翻转
$flipped = Arr::flip(['a' => 1, 'b' => 2, 'c' => 3]); // [1 => 'a', 2 => 'b', 3 => 'c']

// 数组列提取
$users = [
    ['id' => 1, 'name' => '张三', 'age' => 25],
    ['id' => 2, 'name' => '李四', 'age' => 30]
];
$names = Arr::column($users, 'name'); // ['张三', '李四']
$indexed = Arr::column($users, 'name', 'id'); // [1 => '张三', 2 => '李四']

数组键值操作

use Kode\Array\Arr;

// 数组映射键名
$mapped = Arr::mapKeys(['a' => 1, 'b' => 2], fn($key) => strtoupper($key)); // ['A' => 1, 'B' => 2]

// 数组映射值
$mapped = Arr::mapValues(['a' => 1, 'b' => 2], fn($value) => $value * 2); // ['a' => 2, 'b' => 4]

// 数组合并键值
$combined = Arr::combine(['a', 'b', 'c'], [1, 2, 3]); // ['a' => 1, 'b' => 2, 'c' => 3]

// 数组填充键值
$filled = Arr::fillKeys(['a', 'b', 'c'], 0); // ['a' => 0, 'b' => 0, 'c' => 0]

// 数组填充
$filled = Arr::fill(0, 5, 0); // [0, 0, 0, 0, 0]

数组随机操作

use Kode\Array\Arr;

// 数组随机元素
$random = Arr::random([1, 2, 3, 4, 5]); // 随机返回其中一个元素

// 数组随机多个元素
$randomMany = Arr::randomMany([1, 2, 3, 4, 5], 3); // 随机返回3个元素

数组元素操作

use Kode\Array\Arr;

$array = [1, 2, 3, 4, 5];

// 数组弹出第一个元素
$first = Arr::shift($array); // 1,$array变为[2, 3, 4, 5]

// 数组弹出最后一个元素
$last = Arr::pop($array); // 5,$array变为[2, 3, 4]

// 数组头部添加元素
$count = Arr::unshift($array, 0); // 4,$array变为[0, 2, 3, 4]

// 数组尾部添加元素
$count = Arr::push($array, 5); // 5,$array变为[0, 2, 3, 4, 5]

// 数组删除指定元素
$removed = Arr::remove([1, 2, 3, 2, 4, 2], 2); // [1, 3, 4]

// 数组删除指定键名
$removed = Arr::removeKey(['a' => 1, 'b' => 2, 'c' => 3], 'b'); // ['a' => 1, 'c' => 3]

字符串处理模块使用示例

字符串处理模块提供了丰富的字符串操作功能,包括脱敏、验证、转换、编码解码等。

字符串脱敏

mask() - 字符串脱敏

use Kode\String\Str;

// 字符串脱敏
$masked = Str::mask('13800138000', 3, 4, '*'); // '138****8000'
$masked = Str::mask('user@example.com', 2, 4, '*'); // 'us****@example.com'

#### maskPhone() - 手机号脱敏

// 手机号脱敏
$phone = Str::maskPhone('13800138000'); // '138****8000'
$phone = Str::maskPhone('13800138000', 3, 4); // '138****8000'

#### maskEmail() - 邮箱脱敏

// 邮箱脱敏
$email = Str::maskEmail('user@example.com'); // 'us***@example.com'
$email = Str::maskEmail('user@example.com', 2, 3); // 'us***@example.com'

#### maskIdCard() - 身份证号脱敏

// 身份证号脱敏
$idCard = Str::maskIdCard('110101199001011234'); // '110101********1234'
$idCard = Str::maskIdCard('110101199001011234', 6, 8); // '110101********1234'

#### maskBankCard() - 银行卡号脱敏

// 银行卡号脱敏
$bankCard = Str::maskBankCard('6222021234567890123'); // '622202********0123'
$bankCard = Str::maskBankCard('6222021234567890123', 6, 10); // '622202********0123'

#### maskName() - 姓名脱敏

// 姓名脱敏
$name = Str::maskName('张三'); // '张*'
$name = Str::maskName('欧阳修'); // '欧阳*'
$name = Str::maskName('张三丰', 1, 1); // '张*丰'

字符串长度和截断

length() - 字符串长度

use Kode\String\Str;

// 字符串长度
$length = Str::length('你好世界'); // 4(使用mb_strlen)

#### truncate() - 字符串截断

// 字符串截断
$truncated = Str::truncate('这是一段很长的文本内容', 10); // '这是一段很长的文...'
$truncated = Str::truncate('这是一段很长的文本内容', 10, '---'); // '这是一段很长的文---'

#### limit() - 字符串限制长度

// 字符串限制长度
$limited = Str::limit('这是一段很长的文本内容', 10); // '这是一段很长的文...'
$limited = Str::limit('短文本', 10); // '短文本'(不超过长度不截断)

#### wordTruncate() - 字符串单词截断

// 字符串单词截断
$wordTruncate = Str::wordTruncate('This is a long text content', 10); // 'This is a...'

字符串命名转换

snake() - 驼峰转下划线

use Kode\String\Str;

// 驼峰转下划线
$snake = Str::snake('helloWorld'); // 'hello_world'
$snake = Str::snake('HelloWorld'); // 'hello_world'
$snake = Str::snake('HelloWorld', '-'); // 'hello-world'

#### camel() - 下划线转驼峰

// 下划线转驼峰
$camel = Str::camel('hello_world'); // 'helloWorld'
$camel = Str::camel('hello-world'); // 'helloWorld'
$camel = Str::camel('hello_world', '-'); // 'helloWorld'

#### ucfirst() - 首字母大写

// 首字母大写
$ucfirst = Str::ucfirst('hello'); // 'Hello'

#### lcfirst() - 首字母小写

// 首字母小写
$lcfirst = Str::lcfirst('Hello'); // 'hello'

#### ucwords() - 单词首字母大写

// 单词首字母大写
$ucwords = Str::ucwords('hello world'); // 'Hello World'

#### upper() - 全部大写

// 全部大写
$upper = Str::upper('hello'); // 'HELLO'

#### lower() - 全部小写

// 全部小写
$lower = Str::lower('HELLO'); // 'hello'

#### swap() - 大小写转换

// 大小写转换
$swap = Str::swap('Hello'); // 'hELLO'

#### title() - 标题格式

// 标题格式
$title = Str::title('hello world'); // 'Hello World'

字符串查找和判断

use Kode\String\Str;

// 是否包含子串
$contains = Str::contains('hello world', 'world'); // true
$contains = Str::contains('hello world', 'php'); // false

// 是否以子串开头
$startsWith = Str::startsWith('hello world', 'hello'); // true
$startsWith = Str::startsWith('hello world', 'world'); // false

// 是否以子串结尾
$endsWith = Str::endsWith('hello world', 'world'); // true
$endsWith = Str::endsWith('hello world', 'hello'); // false

// 子串首次出现位置
$pos = Str::pos('hello world', 'world'); // 6
$pos = Str::pos('hello world', 'php'); // false

// 子串最后一次出现位置
$pos = Str::rpos('hello world world', 'world'); // 12
$pos = Str::rpos('hello world', 'php'); // false

// 子串出现次数
$count = Str::count('hello world world', 'world'); // 2

// 字符串是否匹配正则
$match = Str::match('hello123', '/^[a-z]+\d+$/'); // true
$match = Str::match('hello', '/^[a-z]+\d+$/'); // false

字符串替换

use Kode\String\Str;

// 字符串替换
$replaced = Str::replace('hello world', 'world', 'php'); // 'hello php'

// 字符串批量替换
$replaced = Str::replaceArray('hello world', ['hello' => 'hi', 'world' => 'php']); // 'hi php'

// 正则替换
$replaced = Str::replaceRegex('hello123world', '/\d+/', '456'); // 'hello456world'

// 字符串截取并替换
$replaced = Str::substrReplace('hello world', 'php', 6, 5); // 'hello php'

字符串分割和连接

split() - 字符串分割

use Kode\String\Str;

// 字符串分割
$parts = Str::split('hello,world,php', ','); // ['hello', 'world', 'php']

#### toArray() - 字符串分割为数组

// 字符串分割为数组
$array = Str::toArray('hello,world,php', ','); // ['hello', 'world', 'php']

#### fromArray() - 数组连接为字符串

// 数组连接为字符串
$string = Str::fromArray(['hello', 'world', 'php'], ','); // 'hello,world,php'

#### join() - 字符串连接

// 字符串连接
$joined = Str::join(['hello', 'world', 'php'], ','); // 'hello,world,php'

#### concat() - 字符串拼接

// 字符串拼接
$concat = Str::concat('hello', ' ', 'world'); // 'hello world'

字符串去除空白

trim() - 去除首尾空白

use Kode\String\Str;

// 去除首尾空白
$trimmed = Str::trim('  hello world  '); // 'hello world'

#### ltrim() - 去除左侧空白

// 去除左侧空白
$ltrim = Str::ltrim('  hello world  '); // 'hello world  '

#### rtrim() - 去除右侧空白

// 去除右侧空白
$rtrim = Str::rtrim('  hello world  '); // '  hello world'

#### clean() - 去除所有空白

// 去除所有空白
$clean = Str::clean('  hello   world  '); // 'helloworld'

字符串填充

padLeft() - 左侧填充

use Kode\String\Str;

// 左侧填充
$padded = Str::padLeft('123', 6, '0'); // '000123'

#### padRight() - 右侧填充

// 右侧填充
$padded = Str::padRight('123', 6, '0'); // '123000'

#### padBoth() - 两侧填充

// 两侧填充
$padded = Str::padBoth('123', 7, '*'); // '**123**'

字符串重复

repeat() - 字符串重复

use Kode\String\Str;

// 字符串重复
$repeated = Str::repeat('hello', 3); // 'hellohellohello'

#### reverse() - 字符串反转

// 字符串反转
$reversed = Str::reverse('hello'); // 'olleh'

字符串随机

random() - 生成随机字符串

use Kode\String\Str;

// 生成随机字符串
$random = Str::random(16); // 16位随机字符串

#### numeric() - 生成随机数字字符串

// 生成随机数字字符串
$numeric = Str::numeric(6); // 6位随机数字字符串

#### alpha() - 生成随机字母字符串

// 生成随机字母字符串
$alpha = Str::alpha(8); // 8位随机字母字符串

字符串编码解码

toBase64() - Base64编码

use Kode\String\Str;

// Base64编码
$base64 = Str::toBase64('hello'); // 'aGVsbG8='

#### fromBase64() - Base64解码

// Base64解码
$decoded = Str::fromBase64('aGVsbG8='); // 'hello'

#### toUrlEncode() - URL编码

// URL编码
$urlEncoded = Str::toUrlEncode('hello world'); // 'hello%20world'

#### fromUrlEncode() - URL解码

// URL解码
$urlDecoded = Str::fromUrlEncode('hello%20world'); // 'hello world'

#### toHtmlEntities() - HTML实体编码

// HTML实体编码
$htmlEncoded = Str::toHtmlEntities('<div>hello</div>'); // '&lt;div&gt;hello&lt;/div&gt;'

#### fromHtmlEntities() - HTML实体解码

// HTML实体解码
$htmlDecoded = Str::fromHtmlEntities('&lt;div&gt;hello&lt;/div&gt;'); // '<div>hello</div>'

#### toJson() - JSON编码

// JSON编码
$json = Str::toJson(['name' => '张三', 'age' => 25]); // '{"name":"张三","age":25}'

#### fromJson() - JSON解码

// JSON解码
$decoded = Str::fromJson('{"name":"张三","age":25}'); // ['name' => '张三', 'age' => 25]

#### toXml() - XML编码

// XML编码
$xml = Str::toXml(['name' => '张三', 'age' => 25], 'root'); // '<root><name>张三</name><age>25</age></root>'

#### fromXml() - XML解码

// XML解码
$decoded = Str::fromXml('<root><name>张三</name><age>25</age></root>'); // ['name' => '张三', 'age' => 25]

#### toBinary() - 二进制编码

// 二进制编码
$binary = Str::toBinary('hello'); // '0110100001100101011011000110110001101111'

#### fromBinary() - 二进制解码

// 二进制解码
$decoded = Str::fromBinary('0110100001100101011011000110110001101111'); // 'hello'

#### toHex() - 十六进制编码

// 十六进制编码
$hex = Str::toHex('hello'); // '68656c6c6f'

// 十六进制解码
$decoded = Str::fromHex('68656c6c6f'); // 'hello'

字符串哈希

md5() - MD5哈希

use Kode\String\Str;

// MD5哈希
$md5 = Str::md5('hello'); // '5d41402abc4b2a76b9719d911017c592'

#### sha1() - SHA1哈希

// SHA1哈希
$sha1 = Str::sha1('hello'); // 'aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d'

#### sha256() - SHA256哈希

// SHA256哈希
$sha256 = Str::sha256('hello'); // '2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824'

#### sha512() - SHA512哈希

// SHA512哈希
$sha512 = Str::sha512('hello'); // '9b71d224bd62f3785d96d46ad3ea3d73319bfbc2890caadae2dff72519673ca72323c3d99ba5c11d7c7acc6e14b8c5da0c4663475c2e5c3adef46f73bcdec043'

字符串验证

isEmail() - 是否为邮箱

use Kode\String\Str;

// 是否为邮箱
$isEmail = Str::isEmail('user@example.com'); // true
$isEmail = Str::isEmail('invalid-email'); // false

#### Str::isUrl() - 是否为URL

// 是否为URL
$isUrl = Str::isUrl('https://example.com'); // true
$isUrl = Str::isUrl('not-a-url'); // false

#### Str::isIp() - 是否为IP地址

// 是否为IP地址
$isIp = Str::isIp('192.168.1.1'); // true
$isIp = Str::isIp('not-an-ip'); // false

#### Str::isIpv4() - 是否为IPv4地址

// 是否为IPv4地址
$isIpv4 = Str::isIpv4('192.168.1.1'); // true
$isIpv4 = Str::isIpv4('2001:0db8:85a3:0000:0000:8a2e:0370:7334'); // false

#### Str::isIpv6() - 是否为IPv6地址

// 是否为IPv6地址
$isIpv6 = Str::isIpv6('2001:0db8:85a3:0000:0000:8a2e:0370:7334'); // true
$isIpv6 = Str::isIpv6('192.168.1.1'); // false

#### Str::isPhone() - 是否为手机号

// 是否为手机号
$isPhone = Str::isPhone('13800138000'); // true
$isPhone = Str::isPhone('12345678901'); // false

#### Str::isIdCard() - 是否为身份证号

// 是否为身份证号
$isIdCard = Str::isIdCard('110101199001011234'); // true
$isIdCard = Str::isIdCard('123456789012345678'); // false

#### Str::isBankCard() - 是否为银行卡号

// 是否为银行卡号
$isBankCard = Str::isBankCard('6222021234567890123'); // true
$isBankCard = Str::isBankCard('1234567890'); // false

#### Str::isNumeric() - 是否为数字

// 是否为数字
$isNumeric = Str::isNumeric('12345'); // true
$isNumeric = Str::isNumeric('abc123'); // false

#### Str::isAlpha() - 是否为字母

// 是否为字母
$isAlpha = Str::isAlpha('hello'); // true
$isAlpha = Str::isAlpha('hello123'); // false

#### Str::isAlnum() - 是否为字母数字

// 是否为字母数字
$isAlnum = Str::isAlnum('hello123'); // true
$isAlnum = Str::isAlnum('hello world'); // false

#### Str::isHex() - 是否为十六进制

// 是否为十六进制
$isHex = Str::isHex('1a2b3c'); // true
$isHex = Str::isHex('1g2h3i'); // false

#### Str::isBinary() - 是否为二进制

// 是否为二进制
$isBinary = Str::isBinary('01010101'); // true
$isBinary = Str::isBinary('12345678'); // false

#### Str::isJson() - 是否为JSON

// 是否为JSON
$isJson = Str::isJson('{"name":"张三"}'); // true
$isJson = Str::isJson('not json'); // false

#### Str::isXml() - 是否为XML

// 是否为XML
$isXml = Str::isXml('<root>hello</root>'); // true
$isXml = Str::isXml('not xml'); // false

#### Str::isSerialized() - 是否为序列化数据

// 是否为序列化数据
$isSerialized = Str::isSerialized('a:1:{i:0;s:5:"hello";}'); // true
$isSerialized = Str::isSerialized('not serialized'); // false

#### Str::isBase64() - 是否为Base64

// 是否为Base64
$isBase64 = Str::isBase64('aGVsbG8='); // true
$isBase64 = Str::isBase64('not base64'); // false

字符串转换

Str::toArray() - 字符串转数组

use Kode\String\Str;

// 字符串转数组
$array = Str::toArray('hello,world,php', ','); // ['hello', 'world', 'php']

#### Str::fromArray() - 数组转字符串

// 数组转字符串
$string = Str::fromArray(['hello', 'world', 'php'], ','); // 'hello,world,php'

#### Str::toObject() - 字符串转对象

// 字符串转对象
$object = Str::toObject('{"name":"张三","age":25}'); // stdClass Object ( [name] => 张三 [age] => 25 )

#### Str::fromObject() - 对象转字符串

// 对象转字符串
$string = Str::fromObject((object)['name' => '张三', 'age' => 25]); // '{"name":"张三","age":25}'

#### Str::toQuery() - 字符串转查询字符串

// 字符串转查询字符串
$query = Str::toQuery(['name' => '张三', 'age' => 25]); // 'name=%E5%BC%A0%E4%B8%89&age=25'

#### Str::fromQuery() - 查询字符串转数组

// 查询字符串转数组
$array = Str::fromQuery('name=%E5%BC%A0%E4%B8%89&age=25'); // ['name' => '张三', 'age' => 25]

字符串格式化

Str::format() - 字符串格式化

use Kode\String\Str;

// 字符串格式化
$formatted = Str::format('Hello, %s! You are %d years old.', '张三', 25); // 'Hello, 张三! You are 25 years old.'

#### Str::template() - 字符串模板渲染

// 字符串模板渲染
$rendered = Str::template('Hello, {{name}}! Age: {{age}}', ['name' => '张三', 'age' => 25]); // 'Hello, 张三! Age: 25'

#### Str::indent() - 字符串缩进

// 字符串缩进
$indented = Str::indent('hello', 4); // '    hello'

#### Str::unindent() - 字符串去除缩进

// 字符串去除缩进
$unindented = Str::unindent('    hello'); // 'hello'

字符串字符操作

Str::first() - 获取字符串首字符

use Kode\String\Str;

// 获取字符串首字符
$first = Str::first('hello'); // 'h'

#### Str::last() - 获取字符串尾字符

// 获取字符串尾字符
$last = Str::last('hello'); // 'o'

#### Str::firstN() - 获取字符串前N个字符

// 获取字符串前N个字符
$firstN = Str::firstN('hello', 2); // 'he'

#### Str::lastN() - 获取字符串后N个字符

// 获取字符串后N个字符
$lastN = Str::lastN('hello', 2); // 'lo'

#### Str::removeFirst() - 去除首字符

// 去除首字符
$removed = Str::removeFirst('hello'); // 'ello'

#### Str::removeLast() - 去除尾字符

// 去除尾字符
$removed = Str::removeLast('hello'); // 'hell'

#### Str::removeFirstN() - 去除前N个字符

// 去除前N个字符
$removed = Str::removeFirstN('hello', 2); // 'llo'

#### Str::removeLastN() - 去除后N个字符

// 去除后N个字符
$removed = Str::removeLastN('hello', 2); // 'hel'

字符串统计

Str::count() - 统计子串出现次数

use Kode\String\Str;

// 统计子串出现次数
$count = Str::count('hello world world', 'world'); // 2

#### Str::wordCount() - 统计单词数

// 统计单词数
$wordCount = Str::wordCount('hello world php'); // 3

#### Str::charCount() - 统计字符数

// 统计字符数
$charCount = Str::charCount('hello'); // 5

#### Str::byteLength() - 统计字节长度

// 统计字节长度
$byteLength = Str::byteLength('你好'); // 6(UTF-8编码)

字符串安全

Str::escapeHtml() - 转义HTML特殊字符

use Kode\String\Str;

// 转义HTML特殊字符
$escaped = Str::escapeHtml('<div>hello</div>'); // '&lt;div&gt;hello&lt;/div&gt;'

#### Str::escapeSql() - 转义SQL特殊字符

// 转义SQL特殊字符
$escaped = Str::escapeSql("O'Reilly"); // "O\'Reilly"

#### Str::escapeJs() - 转义JavaScript特殊字符

// 转义JavaScript特殊字符
$escaped = Str::escapeJs("It's a test"); // "It\'s a test"

#### Str::escapeRegex() - 转义正则表达式特殊字符

// 转义正则表达式特殊字符
$escaped = Str::escapeRegex('hello.world'); // 'hello\.world'

字符串比较

Str::compare() - 字符串比较

use Kode\String\Str;

// 字符串比较
$compare = Str::compare('hello', 'hello'); // 0(相等)
$compare = Str::compare('hello', 'world'); // -15(不相等)

#### Str::similarity() - 字符串相似度

// 字符串相似度
$similarity = Str::similarity('hello', 'hello'); // 1.0(完全相同)
$similarity = Str::similarity('hello', 'world'); // 0.2(相似度)

#### Str::distance() - 字符串编辑距离

// 字符串编辑距离
$distance = Str::distance('hello', 'hello'); // 0(相同)
$distance = Str::distance('hello', 'world'); // 4(编辑距离)

时间处理模块使用示例

时间处理模块提供了丰富的时间操作功能,包括时间格式化、时间计算、日期范围计算、人性化时间显示等。

时间格式化

Time::format() - 格式化时间

use Kode\Time\Time;

// 格式化时间
$formatted = Time::format(time(), 'Y-m-d H:i:s'); // '2025-12-26 12:00:00'
$formatted = Time::format(time(), 'Y年m月d日'); // '2025年12月26日'
$formatted = Time::format(1735200000, 'Y-m-d'); // '2025-12-26'

#### Time::now() - 获取当前时间

// 获取当前时间
$now = Time::now(); // '2025-12-26 12:00:00'
$now = Time::now('Y-m-d'); // '2025-12-26'
$now = Time::now('H:i:s'); // '12:00:00'

#### Time::today() - 获取今天日期

// 获取今天日期
$today = Time::today(); // '2025-12-26'
$today = Time::today('Y-m-d H:i:s'); // '2025-12-26 00:00:00'

#### Time::yesterday() - 获取昨天日期

// 获取昨天日期
$yesterday = Time::yesterday(); // '2025-12-25'
$yesterday = Time::yesterday('Y-m-d H:i:s'); // '2025-12-25 00:00:00'

#### Time::tomorrow() - 获取明天日期

// 获取明天日期
$tomorrow = Time::tomorrow(); // '2025-12-27'
$tomorrow = Time::tomorrow('Y-m-d H:i:s'); // '2025-12-27 00:00:00'

时间计算

Time::add() - 时间加法

use Kode\Time\Time;

$timestamp = time();

// 时间加法
$newTime = Time::add($timestamp, 3600); // 加1小时
$newTime = Time::add($timestamp, 86400); // 加1天
$newTime = Time::add($timestamp, 604800); // 加1周

#### Time::sub() - 时间减法

// 时间减法
$newTime = Time::sub($timestamp, 3600); // 减1小时
$newTime = Time::sub($timestamp, 86400); // 减1天
$newTime = Time::sub($timestamp, 604800); // 减1周

#### Time::diff() - 时间差

// 时间差
$diff = Time::diff(time(), time() - 3600); // 3600(秒)
$diff = Time::diff(time() - 86400, time()); // 86400(秒)

#### Time::diffForHumans() - 人性化时间差

// 人性化时间差
$human = Time::diffForHumans(time() - 60); // '1分钟前'
$human = Time::diffForHumans(time() - 3600); // '1小时前'
$human = Time::diffForHumans(time() - 86400); // '1天前'
$human = Time::diffForHumans(time() - 2592000); // '1个月前'
$human = Time::diffForHumans(time() - 31536000); // '1年前'
$human = Time::diffForHumans(time() + 3600); // '1小时后'
$human = Time::diffForHumans(time() + 86400); // '1天后'

// 指定基准时间的人性化时间差
$human = Time::diffForHumans(time() - 3600, time() - 7200); // '1小时前'

周日期范围

Time::weekStart() - 获取本周开始时间

use Kode\Time\Time;

// 获取本周开始时间
$weekStart = Time::weekStart(); // 本周一00:00:00的时间戳
$weekStart = Time::weekStart(time()); // 指定时间所在周的开始时间
$weekStartFormatted = Time::format(Time::weekStart(), 'Y-m-d H:i:s'); // '2025-12-22 00:00:00'

#### Time::weekEnd() - 获取本周结束时间

// 获取本周结束时间
$weekEnd = Time::weekEnd(); // 本周日23:59:59的时间戳
$weekEnd = Time::weekEnd(time()); // 指定时间所在周的结束时间
$weekEndFormatted = Time::format(Time::weekEnd(), 'Y-m-d H:i:s'); // '2025-12-28 23:59:59'

#### lastWeekStart() - 获取上周开始时间

// 获取上周开始时间
$lastWeekStart = Time::lastWeekStart(); // 上周一00:00:00的时间戳
$lastWeekStartFormatted = Time::format(Time::lastWeekStart(), 'Y-m-d H:i:s'); // '2025-12-15 00:00:00'

#### lastWeekEnd() - 获取上周结束时间

// 获取上周结束时间
$lastWeekEnd = Time::lastWeekEnd(); // 上周日23:59:59的时间戳
$lastWeekEndFormatted = Time::format(Time::lastWeekEnd(), 'Y-m-d H:i:s'); // '2025-12-21 23:59:59'

月日期范围

Time::monthStart() - 获取本月开始时间

use Kode\Time\Time;

// 获取本月开始时间
$monthStart = Time::monthStart(); // 本月1日00:00:00的时间戳
$monthStart = Time::monthStart(time()); // 指定时间所在月的开始时间
$monthStartFormatted = Time::format(Time::monthStart(), 'Y-m-d H:i:s'); // '2025-12-01 00:00:00'

#### Time::monthEnd() - 获取本月结束时间

// 获取本月结束时间
$monthEnd = Time::monthEnd(); // 本月最后一天23:59:59的时间戳
$monthEnd = Time::monthEnd(time()); // 指定时间所在月的结束时间
$monthEndFormatted = Time::format(Time::monthEnd(), 'Y-m-d H:i:s'); // '2025-12-31 23:59:59'

#### lastMonthStart() - 获取上月开始时间

// 获取上月开始时间
$lastMonthStart = Time::lastMonthStart(); // 上月1日00:00:00的时间戳
$lastMonthStartFormatted = Time::format(Time::lastMonthStart(), 'Y-m-d H:i:s'); // '2025-11-01 00:00:00'

#### lastMonthEnd() - 获取上月结束时间

// 获取上月结束时间
$lastMonthEnd = Time::lastMonthEnd(); // 上月最后一天23:59:59的时间戳
$lastMonthEndFormatted = Time::format(Time::lastMonthEnd(), 'Y-m-d H:i:s'); // '2025-11-30 23:59:59'

年日期范围

yearStart() - 获取本年开始时间

use Kode\Time\Time;

// 获取本年开始时间
$yearStart = Time::yearStart(); // 本年1月1日00:00:00的时间戳
$yearStart = Time::yearStart(time()); // 指定时间所在年的开始时间
$yearStartFormatted = Time::format(Time::yearStart(), 'Y-m-d H:i:s'); // '2025-01-01 00:00:00'

#### yearEnd() - 获取本年结束时间

// 获取本年结束时间
$yearEnd = Time::yearEnd(); // 本年12月31日23:59:59的时间戳
$yearEnd = Time::yearEnd(time()); // 指定时间所在年的结束时间
$yearEndFormatted = Time::format(Time::yearEnd(), 'Y-m-d H:i:s'); // '2025-12-31 23:59:59'

#### lastYearStart() - 获取上年开始时间

// 获取上年开始时间
$lastYearStart = Time::lastYearStart(); // 上年1月1日00:00:00的时间戳
$lastYearStartFormatted = Time::format(Time::lastYearStart(), 'Y-m-d H:i:s'); // '2024-01-01 00:00:00'

#### lastYearEnd() - 获取上年结束时间

// 获取上年结束时间
$lastYearEnd = Time::lastYearEnd(); // 上年12月31日23:59:59的时间戳
$lastYearEndFormatted = Time::format(Time::lastYearEnd(), 'Y-m-d H:i:s'); // '2024-12-31 23:59:59'

时间判断

between() - 判断是否在某个时间区间内

use Kode\Time\Time;

$timestamp = time();

// 判断是否在某个时间区间内
$inRange = Time::between($timestamp, time() - 3600, time() + 3600); // true
$inRange = Time::between(time() - 7200, time() - 3600, time()); // false

#### isToday() - 判断是否是今天

// 判断是否是今天
$isToday = Time::isToday($timestamp); // true
$isToday = Time::isToday(time() - 86400); // false

#### isYesterday() - 判断是否是昨天

// 判断是否是昨天
$isYesterday = Time::isYesterday(time() - 86400); // true
$isYesterday = Time::isYesterday(time()); // false

#### isTomorrow() - 判断是否是明天

// 判断是否是明天
$isTomorrow = Time::isTomorrow(time() + 86400); // true
$isTomorrow = Time::isTomorrow(time()); // false

#### Time::isThisWeek() - 判断是否是本周

// 判断是否是本周
$isThisWeek = Time::isThisWeek($timestamp); // true
$isThisWeek = Time::isThisWeek(time() - 604800); // false

#### Time::isThisMonth() - 判断是否是本月

// 判断是否是本月
$isThisMonth = Time::isThisMonth($timestamp); // true
$isThisMonth = Time::isThisMonth(strtotime('2025-11-01')); // false

#### Time::isThisYear() - 判断是否是本年

// 判断是否是本年
$isThisYear = Time::isThisYear($timestamp); // true
$isThisYear = Time::isThisYear(strtotime('2024-01-01')); // false

日期信息获取

Time::daysInMonth() - 获取某个月的天数

use Kode\Time\Time;

// 获取某个月的天数
$days = Time::daysInMonth(12); // 31(12月有31天)
$days = Time::daysInMonth(2, 2024); // 29(2024年2月有29天,闰年)
$days = Time::daysInMonth(2, 2023); // 28(2023年2月有28天,平年)

#### Time::dayOfWeek() - 获取某天是周几

// 获取某天是周几
$weekday = Time::dayOfWeek(time()); // 0-6(0表示周日,1表示周一,以此类推)
$weekday = Time::dayOfWeek(strtotime('2025-12-26')); // 5(周五)

#### Time::dayOfWeekName() - 获取某天是周几(中文名称)

// 获取某天是周几(中文名称)
$weekdayName = Time::dayOfWeekName(time()); // '周五'
$weekdayName = Time::dayOfWeekName(strtotime('2025-12-28')); // '周日'

#### Time::dayOfYear() - 获取某天是本年第几天

// 获取某天是本年第几天
$dayOfYear = Time::dayOfYear(time()); // 360(2025年第360天)
$dayOfYear = Time::dayOfYear(strtotime('2025-01-01')); // 1(第1天)

#### Time::weekOfYear() - 获取某天是本年第几周

// 获取某天是本年第几周
$weekOfYear = Time::weekOfYear(time()); // 52(第52周)
$weekOfYear = Time::weekOfYear(strtotime('2025-01-01')); // 1(第1周)

年龄计算

Time::age() - 计算年龄

use Kode\Time\Time;

// 计算年龄
$age = Time::age('1990-01-01'); // 35(假设当前是2025年)
$age = Time::age('2000-12-31'); // 24(假设当前是2025年)
$age = Time::age('2010-06-15'); // 15(假设当前是2025年)

时间戳转换

Time::toTimestamp() - 时间字符串转时间戳

use Kode\Time\Time;

// 时间字符串转时间戳
$timestamp = Time::toTimestamp('2025-12-26 12:00:00'); // 1735200000
$timestamp = Time::toTimestamp('2025-12-26'); // 1735152000
$timestamp = Time::toTimestamp('now'); // 当前时间戳
$timestamp = Time::toTimestamp('+1 day'); // 明天同一时间的时间戳

#### Time::toMillisecond() - 时间戳转毫秒

// 时间戳转毫秒
$millisecond = Time::toMillisecond(time()); // 1735200000000
$millisecond = Time::toMillisecond(1735200000); // 1735200000000

#### Time::fromMillisecond() - 毫秒转时间戳

// 毫秒转时间戳
$timestamp = Time::fromMillisecond(1735200000000); // 1735200000

#### Time::millisecond() - 获取当前毫秒时间戳

// 获取当前毫秒时间戳
$millisecond = Time::millisecond(); // 当前时间的毫秒时间戳

#### Time::microsecond() - 获取当前微秒时间戳

// 获取当前微秒时间戳
$microsecond = Time::microsecond(); // 当前时间的微秒时间戳

#### Time::microtime() - 获取当前时间戳(带微秒)

// 获取当前时间戳(带微秒)
$microtime = Time::microtime(); // 1735200000.123456

时区操作

Time::timezone() - 获取当前时区

use Kode\Time\Time;

// 获取当前时区
$timezone = Time::timezone(); // 'Asia/Shanghai'(或其他时区)

#### Time::setTimezone() - 设置时区

// 设置时区
$success = Time::setTimezone('UTC'); // true
$success = Time::setTimezone('America/New_York'); // true

// 设置时区后获取时间
Time::setTimezone('UTC');
$utcTime = Time::now(); // UTC时间

Time::setTimezone('Asia/Shanghai');
$shanghaiTime = Time::now(); // 上海时间

实际应用场景

use Kode\Time\Time;

// 订单创建时间显示
$createdAt = time() - 3600; // 1小时前创建
$displayTime = Time::diffForHumans($createdAt); // '1小时前'

// 数据统计时间范围
$weekStart = Time::weekStart();
$weekEnd = Time::weekEnd();
// 查询本周数据:WHERE created_at >= $weekStart AND created_at <= $weekEnd

// 用户生日计算
$birthday = '1990-05-15';
$age = Time::age($birthday); // 35岁

// 活动倒计时
$endTime = strtotime('2025-12-31 23:59:59');
$diff = Time::diff(time(), $endTime); // 距离结束的秒数

// 日程安排
$today = Time::today();
$tomorrow = Time::tomorrow();
$weekStart = Time::weekStart();
$weekEnd = Time::weekEnd();

// 数据归档
$lastMonthStart = Time::lastMonthStart();
$lastMonthEnd = Time::lastMonthEnd();
// 归档上月数据:WHERE created_at >= $lastMonthStart AND created_at <= $lastMonthEnd

// 报表生成
$yearStart = Time::yearStart();
$yearEnd = Time::yearEnd();
// 生成本年报表:WHERE created_at >= $yearStart AND created_at <= $yearEnd

// 定时任务检查
if (Time::isToday($taskTime)) {
    // 执行今天的任务
}

// 工作日判断
$weekday = Time::dayOfWeek(time());
if ($weekday >= 1 && $weekday <= 5) {
    // 周一到周五,工作日
} else {
    // 周六周日,休息日
}

// 高精度时间测量
$startTime = Time::microsecond();
// 执行一些代码
$endTime = Time::microsecond();
$duration = $endTime - $startTime; // 微秒

加解密模块使用示例

Crypto::cryptoMd5() - MD5加密(支持加盐)

use Kode\Crypto\Crypto;

// MD5加密(支持加盐)
$md5 = Crypto::cryptoMd5('123456', 'salt123');

#### Crypto::cryptoPasswordHash() - 密码哈希

// 密码哈希
$hash = Crypto::cryptoPasswordHash('123456');

#### Crypto::cryptoPasswordVerify() - 密码验证

// 密码验证
$verify = Crypto::cryptoPasswordVerify('123456', $hash); // true

#### Crypto::cryptoSslEncrypt() - SSL对称加密

// SSL对称加密
$key = '1234567890abcdef';
$encrypt = Crypto::cryptoSslEncrypt('敏感数据', $key);

#### Crypto::cryptoSslDecrypt() - SSL对称解密

// SSL对称解密
$decrypt = Crypto::cryptoSslDecrypt($encrypt, $key); // '敏感数据'

#### Crypto::cryptoHmac() - HMAC签名

// HMAC签名
$hmac = Crypto::cryptoHmac('数据', 'key', 'sha256');

代码生成模块使用示例

use Kode\Generate\Generate;

// 订单号生成
$orderNo = Generate::orderNo(); // 202512251200001234

// 邀请码生成
$inviteCode = Generate::inviteCode(8); // 8位邀请码

// URL安全码生成
$urlSafe = Generate::urlSafeCode(16); // URL安全的随机码

// 注册码生成
$registerCode = Generate::registerCode(12, 4); // 12位注册码,每4位分隔

数学计算模块使用示例

Math::基础运算

Math::add() - 高精度加法

use Kode\Math\Math;

// 高精度加法(解决浮点数精度丢失问题)
$sum = Math::add(0.1, 0.2); // 0.3(而不是0.30000000000000004)
$sum = Math::add('1.1', '2.2', 2); // 3.30(保留2位小数)

#### Math::sub() - 高精度减法

// 高精度减法
$diff = Math::sub(0.3, 0.1); // 0.2
$diff = Math::sub('5.5', '2.2', 2); // 3.30

#### Math::mul() - 高精度乘法

// 高精度乘法
$product = Math::mul(0.1, 0.2); // 0.02
$product = Math::mul('1.5', '2.5', 2); // 3.75

#### Math::div() - 高精度除法

// 高精度除法
$quotient = Math::div(0.3, 0.1); // 3
$quotient = Math::div('10', '3', 2); // 3.33

#### Math::mod() - 取模运算

// 取模运算
$mod = Math::mod(10, 3); // 1
$mod = Math::mod('10.5', '3'); // 1.5

#### Math::pow() - 幂运算

// 幂运算
$pow = Math::pow(2, 10); // 1024
$pow = Math::pow('2.5', 3, 2); // 15.62

#### Math::sqrt() - 平方根运算

// 平方根运算
$sqrt = Math::sqrt(16); // 4
$sqrt = Math::sqrt('2', 4); // 1.4142

取整运算

Math::round() - 四舍五入

// 四舍五入
$rounded = Math::round(3.14159, 2); // 3.14
$rounded = Math::round(3.5, 0); // 4

#### Math::ceil() - 向上取整

// 向上取整
$ceil = Math::ceil(3.2); // 4
$ceil = Math::ceil(3.8, 1); // 3.8
$ceil = Math::ceil('3.21', 1); // 3.3

#### Math::floor() - 向下取整

// 向下取整
$floor = Math::floor(3.8); // 3
$floor = Math::floor(3.2, 1); // 3.2
$floor = Math::floor('3.89', 1); // 3.8

比较运算

Math::compare() - 比较两个数的大小

// 比较两个数的大小
$result = Math::compare(5, 3); // 1(5 > 3)
$result = Math::compare(3, 5); // -1(3 < 5)
$result = Math::compare(5, 5); // 0(相等)

#### Math::equal() - 判断两个数是否相等

// 判断两个数是否相等
$equal = Math::equal(0.1 + 0.2, 0.3); // true(解决浮点数比较问题)
$equal = Math::equal('1.000', '1.00', 2); // true(保留2位小数比较)

格式化

Math::format() - 格式化数字

// 格式化数字
$formatted = Math::format(1234567.89, 2, true); // 1,234,567.89(带千分位)
$formatted = Math::format(1234567.89, 2, false); // 1234567.89(不带千分位)
$formatted = Math::format('1234567.89123', 3, true); // 1,234,567.891

Math::三角函数

Math::sin() - 正弦函数

// 正弦函数
$sin = Math::sin(Math::deg2rad(30)); // 0.5(30度的正弦值)
$sin = Math::sin(3.14159 / 2); // 1(π/2的正弦值)

#### Math::cos() - 余弦函数

// 余弦函数
$cos = Math::cos(Math::deg2rad(60)); // 0.5(60度的余弦值)
$cos = Math::cos(0); // 1(0度的余弦值)

#### Math::tan() - 正切函数

// 正切函数
$tan = Math::tan(Math::deg2rad(45)); // 1(45度的正切值)
$tan = Math::tan(3.14159 / 4); // 1(π/4的正切值)

#### Math::asin() - 反正弦函数

// 反正弦函数
$asin = Math::asin(1); // 1.5708(π/2)
$asin = Math::asin(0.5); // 0.5236(π/6)

#### Math::acos() - 反余弦函数

// 反余弦函数
$acos = Math::acos(0); // 1.5708(π/2)
$acos = Math::acos(0.5); // 1.0472(π/3)

#### Math::atan() - 反正切函数

// 反正切函数
$atan = Math::atan(1); // 0.7854(π/4)
$atan = Math::atan(0); // 0

对数运算

Math::ln() - 自然对数(以e为底)

// 自然对数(以e为底)
$ln = Math::ln(Math::exp(1)); // 1
$ln = Math::ln(2.71828); // 1

#### Math::log10() - 常用对数(以10为底)

// 常用对数(以10为底)
$log10 = Math::log10(100); // 2
$log10 = Math::log10(1000); // 3

#### Math::log() - 自定义底数对数

// 自定义底数对数
$log = Math::log(8, 2); // 3(2的3次方等于8)
$log = Math::log(100, 10); // 2(10的2次方等于100)

Geo::角度转换

Math::rad2deg() - 弧度转角度

// 弧度转角度
$deg = Math::rad2deg(3.14159); // 180(π弧度 = 180度)
$deg = Math::rad2deg(1.5708); // 90(π/2弧度 = 90度)

#### Math::deg2rad() - 角度转弧度

// 角度转弧度
$rad = Math::deg2rad(180); // 3.14159(180度 = π弧度)
$rad = Math::deg2rad(90); // 1.5708(90度 = π/2弧度)

数值操作

Math::abs() - 绝对值

// 绝对值
$abs = Math::abs(-10); // 10
$abs = Math::abs(10); // 10
$abs = Math::abs('-5.5'); // 5.5

#### Math::factorial() - 阶乘

// 阶乘
$factorial = Math::factorial(5); // 120(5! = 5×4×3×2×1)
$factorial = Math::factorial(0); // 1(0! = 1)

#### Math::gcd() - 最大公约数

// 最大公约数
$gcd = Math::gcd(12, 18); // 6
$gcd = Math::gcd(24, 36); // 12

#### Math::lcm() - 最小公倍数

// 最小公倍数
$lcm = Math::lcm(4, 6); // 12
$lcm = Math::lcm(3, 5); // 15

Math::金融计算

Math::percentage() - 百分比计算

// 百分比计算
$percentage = Math::percentage(25, 100); // 25(25占100的25%)
$percentage = Math::percentage('30', '150', 2); // 20.00

#### Math::discount() - 折扣计算

// 折扣计算
$discounted = Math::discount(100, 0.8); // 80(打8折)
$discounted = Math::discount('200', '0.7', 2); // 140.00(打7折)

#### Math::tax() - 税费计算

// 税费计算
$tax = Math::tax(100, 0.1); // 10(100的10%税额)
$tax = Math::tax('500', '0.13', 2); // 65.00(500的13%税额)

#### Math::taxIncluded() - 含税金额计算

// 含税金额计算
$taxIncluded = Math::taxIncluded(100, 0.1); // 110(100 + 10%税)
$taxIncluded = Math::taxIncluded('500', '0.13', 2); // 565.00

#### Math::taxExcluded() - 不含税金额计算

// 不含税金额计算
$taxExcluded = Math::taxExcluded(110, 0.1); // 100(110 / 1.1)
$taxExcluded = Math::taxExcluded('565', '0.13', 2); // 500.00

#### Math::simpleInterest() - 简单利息计算

// 简单利息计算
$simpleInterest = Math::simpleInterest(1000, 0.05, 2); // 100(1000本金,5%年利率,2年)
$simpleInterest = Math::simpleInterest('5000', '0.04', 3, 2); // 600.00

#### Math::compoundInterest() - 复利计算

// 复利计算
$compoundInterest = Math::compoundInterest(1000, 0.05, 2); // 1102.5(1000本金,5%年利率,2年复利)
$compoundInterest = Math::compoundInterest('5000', '0.04', 3, 2); // 5624.32

随机数生成

Math::random() - 生成指定范围内的随机数

// 生成指定范围内的随机数
$random = Math::random(1, 100); // 1-100之间的随机整数
$random = Math::random('1.5', '5.5', 2); // 1.50-5.50之间的随机数(保留2位小数)

范围检查

Math::inRange() - 数值范围检查

// 数值范围检查
$inRange = Math::inRange(5, 1, 10); // true(5在1-10范围内)
$inRange = Math::inRange(15, 1, 10); // false(15不在1-10范围内)

#### Math::clamp() - 限制数值范围

// 限制数值范围
$clamped = Math::clamp(5, 1, 10); // 5(在范围内,保持不变)
$clamped = Math::clamp(15, 1, 10); // 10(超出最大值,限制为10)
$clamped = Math::clamp(-5, 1, 10); // 1(小于最小值,限制为1)
$clamped = Math::clamp('5.5', '1.0', '10.0', 1); // 5.5

Math::数值判断

Math::isPositive() - 判断是否为正数

// 判断是否为正数
$isPositive = Math::isPositive(10); // true
$isPositive = Math::isPositive(-5); // false
$isPositive = Math::isPositive(0); // false

#### Math::isNegative() - 判断是否为负数

// 判断是否为负数
$isNegative = Math::isNegative(-5); // true
$isNegative = Math::isNegative(10); // false
$isNegative = Math::isNegative(0); // false

#### Math::isZero() - 判断是否为零

// 判断是否为零
$isZero = Math::isZero(0); // true
$isZero = Math::isZero(0.0000000001, 10); // true(保留10位小数比较)
$isZero = Math::isZero(1); // false

#### Math::isEven() - 判断是否为偶数

// 判断是否为偶数
$isEven = Math::isEven(4); // true
$isEven = Math::isEven(5); // false

#### Math::isOdd() - 判断是否为奇数

// 判断是否为奇数
$isOdd = Math::isOdd(5); // true
$isOdd = Math::isOdd(4); // false

#### Math::isPrime() - 判断是否为质数

// 判断是否为质数
$isPrime = Math::isPrime(7); // true
$isPrime = Math::isPrime(4); // false
$isPrime = Math::isPrime(2); // true
$isPrime = Math::isPrime(1); // false

#### Math::isValid() - 判断数值是否有效

// 判断数值是否有效
$isValid = Math::isValid(123); // true
$isValid = Math::isValid('123.45'); // true
$isValid = Math::isValid('abc'); // false
$isValid = Math::isValid(INF); // false(无穷大)
$isValid = Math::isValid(NAN); // false(非数字)

插值运算

Math::lerp() - 线性插值

// 线性插值
$lerp = Math::lerp(0, 10, 0.5); // 5(0和10的中点)
$lerp = Math::lerp(0, 10, 0.25); // 2.5(0和10的25%位置)
$lerp = Math::lerp('0', '100', '0.75', 1); // 75.0

Math::统计分析

Math::average() - 平均值计算

// 平均值计算
$avg = Math::average([1, 2, 3, 4, 5]); // 3
$avg = Math::average([1.5, 2.5, 3.5], 2); // 2.50

#### Math::median() - 中位数计算

// 中位数计算
$median = Math::median([1, 2, 3, 4, 5]); // 3
$median = Math::median([1, 2, 3, 4]); // 2.5(2和3的平均值)
$median = Math::median(['1.5', '2.5', '3.5'], 2); // 2.50

#### Math::mode() - 众数计算

// 众数计算
$mode = Math::mode([1, 2, 2, 3, 3, 3]); // 3(出现次数最多)
$mode = Math::mode([1, 2, 3]); // 1(多个众数时返回第一个)

#### Math::standardDeviation() - 标准差计算

// 标准差计算
$stdDev = Math::standardDeviation([1, 2, 3, 4, 5]); // 1.414
$stdDev = Math::standardDeviation([10, 20, 30], 2); // 10.00

实际应用场景

// 电商订单金额计算
$subtotal = Math::add('99.99', '49.99'); // 149.98(商品小计)
$discount = Math::discount($subtotal, '0.9'); // 134.98(打9折)
$tax = Math::tax($discount, '0.13'); // 17.55(13%税)
$total = Math::add($discount, $tax, 2); // 152.53(总金额)

// 贷款利息计算
$principal = 100000; // 本金10万
$rate = 0.05; // 年利率5%
$years = 5; // 5年
$simpleInterest = Math::simpleInterest($principal, $rate, $years); // 25000(简单利息)
$compoundInterest = Math::compoundInterest($principal, $rate, $years); // 27628.16(复利)

// 数据分析
$scores = [85, 92, 78, 90, 88, 95, 82];
$avg = Math::average($scores, 2); // 87.14(平均分)
$median = Math::median($scores, 2); // 88.00(中位数)
$stdDev = Math::standardDeviation($scores, 2); // 5.67(标准差)

// 价格范围检查
$price = 99.99;
$minPrice = 50;
$maxPrice = 100;
if (Math::inRange($price, $minPrice, $maxPrice)) {
    echo '价格在合理范围内';
}

// 数值格式化显示
$amount = 1234567.89123;
$formatted = Math::format($amount, 2, true); // 1,234,567.89

地理位置模块使用示例

Geo::distance() - 计算两个坐标之间的距离

use Kode\Geo\Geo;

// 计算两个坐标之间的距离
$distance = Geo::distance(39.9042, 116.4074, 31.2304, 121.4737, 'km'); // 北京到上海的距离,约1067公里

#### Geo::isValidCoordinate() - 坐标验证

// 坐标验证
$valid = Geo::isValidCoordinate(39.9042, 116.4074); // true

#### Geo::wgs84ToGcj02() - 坐标转换(WGS84转GCJ02)

// 坐标转换(WGS84转GCJ02)
$gcj02 = Geo::wgs84ToGcj02(39.9042, 116.4074);

#### Geo::gcj02ToBd09() - 坐标转换(GCJ02转BD09)

// 坐标转换(GCJ02转BD09)
$bd09 = Geo::gcj02ToBd09($gcj02[0], $gcj02[1]);

IP地址模块使用示例

use Kode\Ip\Ip;

// 获取真实客户端IP
$ip = Ip::getRealIp(); // 获取真实IP地址

// IP地址验证
$valid = Ip::isValid('192.168.1.1'); // true

// 私有IP地址判断
$private = Ip::isPrivate('192.168.1.1'); // true

// IP地址转换
$long = Ip::toLong('192.168.1.1'); // 3232235777
$ipStr = Ip::toString(3232235777); // '192.168.1.1'

消息体模块使用示例

消息体模块提供了完整的API响应构建能力,支持双模式链式调用(实例链式 + 静态链式)、灵活的状态码管理、自定义字段扩展和字段映射功能。

基础使用示例

Message::code() - 设置状态码

use Kode\Message\Message;

// 实例链式调用 - 构建标准响应
$msg = new Message();
$res = $msg->code(200)
           ->msg('操作成功')
           ->data(['id' => 123, 'name' => '测试用户'])
           ->page(['page' => 1, 'size' => 20, 'total' => 100])
           ->ext('trace_id', 'abc123')
           ->ext('request_id', 'req_20250726123456')
           ->result();

// 输出结果
// [
//     'code' => 200,
//     'msg' => '操作成功',
//     'data' => ['id' => 123, 'name' => '测试用户'],
//     'page' => ['page' => 1, 'size' => 20, 'total' => 100],
//     'trace_id' => 'abc123',
//     'request_id' => 'req_20250726123456'
// ]

// 静态链式调用 - 快速构建响应
$res = Message::code(300000)
              ->msg('Token失效,请重新登录')
              ->result();

// 输出结果
// [
//     'code' => 300000,
//     'msg' => 'Token失效,请重新登录'
// ]

// 构造函数初始化 - 一步到位
$res = new Message(200, '创建成功', ['id' => 456]);
// 输出结果
// [
//     'code' => 200,
//     'msg' => '创建成功',
//     'data' => ['id' => 456]
// ]

状态码管理

消息体模块内置了完整的状态码映射体系,支持基础HTTP状态码(200/400/500)和6位业务自定义码。

use Kode\Message\Message;

// 基础成功状态码(200系列)
$res = Message::code(200)->msg('请求成功')->result();
// ['code' => 200, 'msg' => '请求成功']

$res = Message::code(201)->msg('资源创建成功')->result();
// ['code' => 201, 'msg' => '资源创建成功']

$res = Message::code(204)->msg('删除成功')->result();
// ['code' => 204, 'msg' => '删除成功']

// 基础客户端错误状态码(400系列)
$res = Message::code(400)->msg('请求参数错误')->result();
// ['code' => 400, 'msg' => '请求参数错误']

$res = Message::code(401)->msg('未授权访问')->result();
// ['code' => 401, 'msg' => '未授权访问']

$res = Message::code(403)->msg('禁止访问')->result();
// ['code' => 403, 'msg' => '禁止访问']

$res = Message::code(404)->msg('资源不存在')->result();
// ['code' => 404, 'msg' => '资源不存在']

$res = Message::code(422)->msg('数据验证失败')->result();
// ['code' => 422, 'msg' => '数据验证失败']

// 基础服务器错误状态码(500系列)
$res = Message::code(500)->msg('服务器内部错误')->result();
// ['code' => 500, 'msg' => '服务器内部错误']

$res = Message::code(502)->msg('网关错误')->result();
// ['code' => 502, 'msg' => '网关错误']

$res = Message::code(503)->msg('服务不可用')->result();
// ['code' => 503, 'msg' => '服务不可用']

// 6位业务自定义码(300000-399999为业务级错误)
$res = Message::code(300000)->msg('Token失效')->result();
// ['code' => 300000, 'msg' => 'Token失效']

$res = Message::code(300001)->msg('Token已过期')->result();
// ['code' => 300001, 'msg' => 'Token已过期']

$res = Message::code(300002)->msg('Token签名无效')->result();
// ['code' => 300002, 'msg' => 'Token签名无效']

// 4位业务自定义码(400000-499999为业务级错误)
$res = Message::code(400001)->msg('用户不存在')->result();
// ['code' => 400001, 'msg' => '用户不存在']

$res = Message::code(400002)->msg('用户已被禁用')->result();
// ['code' => 400002, 'msg' => '用户已被禁用']

$res = Message::code(400003)->msg('密码错误')->result();
// ['code' => 400003, 'msg' => '密码错误']

// 5位业务自定义码(500000-599999为系统级错误)
$res = Message::code(500001)->msg('数据库连接失败')->result();
// ['code' => 500001, 'msg' => '数据库连接失败']

$res = Message::code(500002)->msg('缓存服务不可用')->result();
// ['code' => 500002, 'msg' => '缓存服务不可用']

自定义状态码映射

Message::setCodeMap() - 全局设置状态码映射

用户可以动态覆盖或新增状态码映射,满足业务特定需求。

use Kode\Message\Message;

// 方式一:全局设置状态码映射
Message::setCodeMap([
    800000 => '自定义业务异常',
    800001 => '订单已取消',
    800002 => '订单已完成',
    900000 => '权限不足',
    900001 => '无操作权限',
    900002 => '角色受限'
]);

// 使用自定义状态码
$res = Message::code(800000)->result();
// ['code' => 800000, 'msg' => '自定义业务异常']

$res = Message::code(800001)->result();
// ['code' => 800001, 'msg' => '订单已取消']

$res = Message::code(900000)->result();
// ['code' => 900000, 'msg' => '权限不足']

#### Message::setCustomCodes() - 实例级设置状态码映射

// 方式二:实例级设置状态码映射
$msg = new Message();
$msg->setCustomCodes([
    700001 => '商品库存不足',
    700002 => '商品已下架',
    700003 => '优惠券已过期'
]);

$res = $msg->code(700001)->result();
// ['code' => 700001, 'msg' => '商品库存不足']

#### Message::addCode() - 动态添加单个状态码

// 方式三:动态添加单个状态码
$msg = new Message();
$msg->addCode(600001, '验证码错误')
    ->addCode(600002, '验证码已过期')
    ->addCode(600003, '发送频率过快');

// 使用动态添加的状态码
$res = $msg->code(600001)->result();
// ['code' => 600001, 'msg' => '验证码错误']

#### Message::getCodeMsg() - 获取状态码对应的消息

// 获取状态码对应的消息
$msg = new Message();
$message = $msg->getCodeMsg(300000); // 'Token失效'
$message = $msg->getCodeMsg(400001); // '用户不存在'
$message = $msg->getCodeMsg(999999); // null(未定义的状态码)

#### Message::codeExists() - 检查状态码是否存在

// 检查状态码是否存在
$exists = $msg->codeExists(200); // true
$exists = $msg->codeExists(300000); // true
$exists = $msg->codeExists(999999); // false

动态字段扩展

动态字段扩展

消息体模块支持任意动态字段扩展,通过__call魔术方法实现灵活的属性设置。

use Kode\Message\Message;

// 基础动态字段扩展
$msg = new Message(200, 'success');
$res = $msg->page(['page' => 1, 'size' => 10, 'total' => 100])
           ->list(['id' => 1, 'name' => 'Item 1'])
           ->total(100)
           ->page_num(1)
           ->page_size(10)
           ->result();

// 输出结果
// [
//     'code' => 200,
//     'msg' => 'success',
//     'page' => ['page' => 1, 'size' => 10, 'total' => 100],
//     'list' => ['id' => 1, 'name' => 'Item 1'],
//     'total' => 100,
//     'page_num' => 1,
//     'page_size' => 10
// ]

#### Message::addFields() - 批量添加扩展字段

// 批量添加扩展字段
$msg = new Message(200, 'success');
$res = $msg->addFields([
        'created_at' => '2025-12-26 12:00:00',
        'updated_at' => '2025-12-26 12:30:00',
        'operator' => 'admin',
        'source' => 'web'
    ])
    ->result();

// 输出结果
// [
//     'code' => 200,
//     'msg' => 'success',
//     'created_at' => '2025-12-26 12:00:00',
//     'updated_at' => '2025-12-26 12:30:00',
//     'operator' => 'admin',
//     'source' => 'web'
// ]

#### 复杂数据结构扩展

// 复杂数据结构扩展
$msg = new Message(200, 'success');
$res = $msg->user_info([
        'id' => 10001,
        'name' => '张三',
        'avatar' => 'https://example.com/avatar.png',
        'level' => 5
    ])
    ->permissions(['read', 'write', 'delete'])
    ->roles(['admin', 'editor'])
    ->metadata([
        'browser' => 'Chrome',
        'platform' => 'Windows',
        'ip' => '192.168.1.100'
    ])
    ->result();

// 输出结果
// [
//     'code' => 200,
//     'msg' => 'success',
//     'user_info' => ['id' => 10001, 'name' => '张三', ...],
//     'permissions' => ['read', 'write', 'delete'],
//     'roles' => ['admin', 'editor'],
//     'metadata' => ['browser' => 'Chrome', ...]
// ]

字段映射与转换

Message::setGlobalFieldMap() - 全局字段映射设置

支持自定义字段映射,满足不同项目或前端框架的命名规范。

use Kode\Message\Message;

// 全局字段映射设置
Message::setGlobalFieldMap([
    'code' => 'status',
    'msg' => 'message',
    'data' => 'payload',
    'page' => 'pagination'
]);

// 使用全局字段映射
$res = Message::code(200)
              ->msg('操作成功')
              ->data(['id' => 123])
              ->page(['page' => 1])
              ->result();

// 输出结果(使用全局映射)
// [
//     'status' => 200,
//     'message' => '操作成功',
//     'payload' => ['id' => 123],
//     'pagination' => ['page' => 1]
// ]

#### Message::fieldMap() - 实例级字段映射

// 实例级字段映射(覆盖全局设置)
$msg = new Message();
$res = $msg->fieldMap([
        'code' => 'errcode',
        'msg' => 'errmsg',
        'data' => 'result'
    ])
    ->code(200)
    ->msg('成功')
    ->data(['list' => [1, 2, 3]])
    ->result();

// 输出结果(使用实例级映射)
// [
//     'errcode' => 200,
//     'errmsg' => '成功',
//     'result' => ['list' => [1, 2, 3]]
// ]

#### 局部字段映射

// 局部字段映射(在result方法中传入)
$msg = new Message(200, 'success');
$res = $msg->data(['id' => 123])
           ->ext('trace_id', 'abc123')
           ->result(['code' => 'status', 'msg' => 'info']);

// 输出结果(使用局部映射)
// [
//     'status' => 200,
//     'info' => 'success',
//     'data' => ['id' => 123],
//     'trace_id' => 'abc123'
// ]

JSON输出

Message::json() - 基本JSON输出

支持直接输出JSON格式响应。

use Kode\Message\Message;

// 基本JSON输出
$msg = new Message();
$json = $msg->code(200)
            ->msg('操作成功')
            ->data(['id' => 123, 'name' => '测试'])
            ->json();

echo $json;
// 输出: {"code":200,"msg":"操作成功","data":{"id":123,"name":"测试"}}

// 静态方法JSON输出
$json = Message::code(300000)
               ->msg('Token失效')
               ->json();

echo $json;
// 输出: {"code":300000,"msg":"Token失效"}

// 带字段映射的JSON输出
$msg = new Message();
$json = $msg->code(200)
            ->msg('成功')
            ->data(['items' => [1, 2, 3]])
            ->json(['code' => 'status', 'msg' => 'message']);

echo $json;
// 输出: {"status":200,"message":"成功","items":[1,2,3]}

// 字符串转换(__toString)
$msg = new Message();
$str = (string)$msg->code(200)->msg('成功')->data(['id' => 1]);
echo $str;
// 输出: {"code":200,"msg":"成功","data":{"id":1}}

实际业务场景示例

use Kode\Message\Message;

// 场景一:用户登录接口响应
function loginResponse(bool $success, array $userInfo = [], string $token = ''): array
{
    if ($success) {
        return Message::code(200)
                      ->msg('登录成功')
                      ->data([
                          'user' => $userInfo,
                          'token' => $token
                      ])
                      ->result();
    }
    
    return Message::code(400001)
                  ->msg('用户名或密码错误')
                  ->result();
}

// 场景二:分页列表接口响应
function listResponse(array $list, int $page, int $size, int $total): array
{
    return Message::code(200)
                  ->msg('获取成功')
                  ->data(['list' => $list])
                  ->page([
                      'page' => $page,
                      'size' => $size,
                      'total' => $total,
                      'pages' => ceil($total / $size)
                  ])
                  ->result();
}

// 场景三:表单验证失败响应
function validationResponse(array $errors): array
{
    $errorMessages = [];
    foreach ($errors as $field => $message) {
        $errorMessages[] = "{$field}: {$message}";
    }
    
    return Message::code(400)
                  ->msg('参数验证失败')
                  ->data(['errors' => $errors])
                  ->ext('error_count', count($errors))
                  ->ext('error_details', implode('; ', $errorMessages))
                  ->result();
}

// 场景四:异常处理响应
function errorResponse(int $code, string $message, ?string $traceId = null): array
{
    $msg = Message::code($code)->msg($message);
    
    if ($traceId) {
        $msg->ext('trace_id', $traceId);
    }
    
    return $msg->result();
}

// 场景五:创建资源成功响应
function createdResponse(mixed $resource, string $location = ''): array
{
    $msg = Message::code(201)
                  ->msg('资源创建成功')
                  ->data(['resource' => $resource]);
    
    if ($location) {
        $msg->ext('location', $location);
    }
    
    return $msg->result();
}

// 场景六:批量操作响应
function batchResponse(int $success, int $failed, array $details = []): array
{
    $code = $failed > 0 ? 400 : 200;
    $msg = $failed > 0 ? '部分操作失败' : '全部操作成功';
    
    return Message::code($code)
                  ->msg($msg)
                  ->data([
                      'success' => $success,
                      'failed' => $failed,
                      'total' => $success + $failed
                  ])
                  ->ext('success_rate', round($success / ($success + $failed) * 100, 2))
                  ->ext('details', $details)
                  ->result();
}

// 场景七:文件上传响应
function uploadResponse(string $fileUrl, string $fileName, int $fileSize): array
{
    return Message::code(200)
                  ->msg('文件上传成功')
                  ->data([
                      'url' => $fileUrl,
                      'filename' => $fileName,
                      'size' => $fileSize
                  ])
                  ->ext('domain', parse_url($fileUrl, PHP_URL_HOST))
                  ->result();
}

// 场景八:搜索结果响应
function searchResponse(array $results, string $keyword, int $total): array
{
    return Message::code(200)
                  ->msg('搜索完成')
                  ->data(['results' => $results])
                  ->ext('keyword', $keyword)
                  ->ext('total', $total)
                  ->ext('highlight', true)
                  ->result();
}

// 场景九:认证失败响应(统一认证错误码)
function authFailedResponse(string $reason = '未授权'): array
{
    $errorCodes = [
        '未授权' => 401,
        'Token失效' => 300000,
        'Token过期' => 300001,
        '权限不足' => 900000,
        '账户禁用' => 400002
    ];
    
    $code = $errorCodes[$reason] ?? 401;
    
    return Message::code($code)
                  ->msg($reason)
                  ->ext('reason', $reason)
                  ->ext('need_relogin', true)
                  ->result();
}

// 场景十:服务降级响应
function degradedResponse(string $service, string $message): array
{
    return Message::code(503)
                  ->msg($message)
                  ->ext('service', $service)
                  ->ext('degraded_at', date('Y-m-d H:i:s'))
                  ->ext('retry_after', 30)
                  ->result();
}

构造函数初始化

支持通过构造函数一步完成初始化,简化代码。

use Kode\Message\Message;

// 基础初始化
$msg1 = new Message();
$res1 = $msg1->result();
// ['code' => 200, 'msg' => 'success']

// 指定状态码
$msg2 = new Message(400);
$res2 = $msg2->result();
// ['code' => 400, 'msg' => '请求参数错误']

// 指定状态码和消息
$msg3 = new Message(200, '查询成功');
$res3 = $msg3->result();
// ['code' => 200, 'msg' => '查询成功']

// 指定状态码、消息和数据
$msg4 = new Message(201, '创建成功', ['id' => 100, 'name' => '新项目']);
$res4 = $msg4->result();
// ['code' => 201, 'msg' => '创建成功', 'data' => ['id' => 100, 'name' => '新项目']]

// 静态方法初始化(简化版)
$res5 = (new Message(200, '成功', ['data' => 123]))->result();
// ['code' => 200, 'msg' => '成功', 'data' => ['data' => 123]]

错误处理与异常捕获

use Kode\Message\Message;

// 基础响应构建(无异常)
try {
    $msg = new Message();
    $result = $msg->code(200)
                  ->msg('操作成功')
                  ->data(['id' => 1])
                  ->result();
    
    echo json_encode($result);
} catch (\Exception $e) {
    // 捕获异常,返回错误响应
    $errorResponse = Message::code(500)
                            ->msg('系统异常')
                            ->ext('error', $e->getMessage())
                            ->result();
    
    http_response_code(500);
    echo json_encode($errorResponse);
}

// 自定义状态码文件加载
try {
    // 加载自定义状态码配置文件
    $msg = new Message(200, 'success', null, '/path/to/custom_codes.php');
    $result = $msg->code(800001)->result();
} catch (\Exception $e) {
    // 配置文件加载失败
    $msg = new Message();
    $result = $msg->code(500)
                  ->msg('状态码配置加载失败')
                  ->ext('error', $e->getMessage())
                  ->result();
}

// 重新加载自定义状态码文件
$msg = new Message(200, 'success', null, '/path/to/codes.php');
// ... 使用过程中的代码修改 ...

// 重新加载配置
$msg->reloadCustomCodeFile();

// 使用重新加载后的配置
$result = $msg->code(800001)->result();

HTTP请求模块使用示例

HTTP请求模块提供了完整的HTTP客户端功能,支持多种HTTP方法、请求配置、响应处理、错误处理、并发请求和PHP 8.5+持久化句柄支持。

基础使用示例

Curl::get() - GET请求

use Kode\Curl\Curl;

// GET请求
$response = Curl::get('https://api.example.com/users');
echo $response->body();
echo $response->json('data');

#### Curl::post() - POST请求

// POST请求(JSON)
$response = Curl::post('https://api.example.com/users', [
    'name' => '张三',
    'email' => 'zhangsan@example.com'
]);
echo $response->json('id');

// POST请求(表单)
$response = Curl::post('https://api.example.com/login', [
    'username' => 'admin',
    'password' => '123456'
], 'form');

// POST请求(multipart)
$response = Curl::post('https://api.example.com/upload', [
    'file' => new \CURLFile('/path/to/file.jpg')
], 'multipart');

多种HTTP方法

Curl::put() - PUT请求

use Kode\Curl\Curl;

// PUT请求
$response = Curl::put('https://api.example.com/users/1', [
    'name' => '李四'
]);
echo $response->json();

#### Curl::patch() - PATCH请求

// PATCH请求
$response = Curl::patch('https://api.example.com/users/1', [
    'status' => 'active'
]);
echo $response->json();

#### Curl::delete() - DELETE请求

// DELETE请求
$response = Curl::delete('https://api.example.com/users/1');
echo $response->json();

#### Curl::head() - HEAD请求

// HEAD请求(仅获取响应头)
$response = Curl::head('https://api.example.com/users');
echo $response->header('Content-Type');

#### Curl::options() - OPTIONS请求

// OPTIONS请求
$response = Curl::options('https://api.example.com/users');
echo $response->header('Allow');

请求配置选项

请求头设置

use Kode\Curl\Curl;

// 设置请求头
$response = Curl::get('https://api.example.com/users', [
    'Authorization' => 'Bearer token123',
    'Accept-Language' => 'zh-CN'
]);
echo $response->json();

#### 超时时间设置

// 设置超时时间
$response = Curl::get('https://api.example.com/users', timeout: 30);
echo $response->json();

#### 用户代理设置

// 设置用户代理
$response = Curl::get('https://api.example.com/users', userAgent: 'MyApp/1.0');
echo $response->json();

#### 来源页面设置

// 设置来源页面
$response = Curl::get('https://api.example.com/users', referer: 'https://example.com');
echo $response->json();

#### Cookie设置

// 设置Cookie
$response = Curl::get('https://api.example.com/users', cookie: 'session=abc123');
echo $response->json();

#### SSL验证设置

// 禁用SSL验证(仅测试环境)
$response = Curl::get('https://api.example.com/users', verifySsl: false);
echo $response->json();

#### 代理设置

// 设置代理
$response = Curl::get('https://api.example.com/users', proxy: 'http://proxy.example.com:8080');
echo $response->json();

// 设置代理认证
$response = Curl::get('https://api.example.com/users', proxyUserPwd: 'user:password');
echo $response->json();

响应处理

Curl::body() - 获取原始响应体

use Kode\Curl\Curl;

$response = Curl::get('https://api.example.com/users');

// 获取原始响应体
echo $response->body();

#### Curl::json() - 获取JSON解析结果

// 获取JSON解析结果
$data = $response->json();
echo $data['name'];

#### Curl::jsonArray() - 获取数组格式的JSON

// 获取数组格式的JSON
$array = $response->jsonArray();
echo $array[0]['name'];

#### Curl::statusCode() - 获取响应状态码

// 获取响应状态码
$statusCode = $response->statusCode();
echo $statusCode; // 200

#### Curl::header() - 获取响应头

// 获取响应头
$contentType = $response->header('Content-Type');
echo $contentType; // 'application/json'

#### Curl::headers() - 获取所有响应头

// 获取所有响应头
$headers = $response->headers();
print_r($headers);

#### Curl::time() - 获取响应时间

// 获取响应时间(毫秒)
$time = $response->time();
echo $time; // 125.5

#### Curl::responseInfo() - 获取原始响应头信息

// 获取原始响应头信息
$responseInfo = $response->responseInfo();
print_r($responseInfo);

#### Curl::isSuccess() - 判断是否成功

// 判断是否成功
if ($response->isSuccess()) {
    echo '请求成功';
}

#### Curl::isRedirect() - 判断是否重定向

// 判断是否重定向
if ($response->isRedirect()) {
    echo '请求重定向';
}

错误处理

Curl::isClientError() - 判断是否为客户端错误

use Kode\Curl\Curl;
use Kode\Curl\Exception\CurlException;
use Kode\Curl\Exception\ClientException;
use Kode\Curl\Exception\ServerException;

try {
    $response = Curl::get('https://api.example.com/users');
    
    // 4xx客户端错误
    if ($response->isClientError()) {
        throw new ClientException(
            "客户端请求错误: " . $response->statusCode(),
            $response->statusCode(),
            $response
        );
    }
    
#### Curl::isServerError() - 判断是否为服务器错误

    // 5xx服务器错误
    if ($response->isServerError()) {
        throw new ServerException(
            "服务器错误: " . $response->statusCode(),
            $response->statusCode(),
            $response
        );
    }
    
    // 正常响应处理
    $data = $response->json();
    print_r($data);
    
} catch (ClientException $e) {
    // 处理4xx错误
    echo "客户端错误: " . $e->getMessage();
    echo "状态码: " . $e->getCode();
    
} catch (ServerException $e) {
    // 处理5xx错误
    echo "服务器错误: " . $e->getMessage();
    echo "状态码: " . $e->getCode();
    
} catch (CurlException $e) {
    // 处理cURL错误(网络问题等)
    echo "cURL错误: " . $e->getMessage();
    echo "错误码: " . $e->getCode();
    
} catch (\Exception $e) {
    // 处理其他异常
    echo "系统错误: " . $e->getMessage();
}

重试机制

Curl::retry() - 自动重试

use Kode\Curl\Curl;

// 自动重试3次,间隔2秒
$response = Curl::get('https://api.example.com/users')
                ->retry(3, 2.0);

echo $response->body();

// POST请求带重试
$response = Curl::post('https://api.example.com/orders', [
    'product_id' => 123,
    'quantity' => 1
])->retry(3, 1.0);

echo $response->json();

并发请求

Curl::multi() - 并发执行多个请求

use Kode\Curl\Curl;

// 并发执行多个请求
$responses = Curl::multi()
    ->add('https://api.example.com/users', 'get')
    ->add('https://api.example.com/posts', 'get')
    ->add('https://api.example.com/comments', 'get')
    ->execute();

// 处理响应
$users = $responses['https://api.example.com/users']->json();
$posts = $responses['https://api.example.com/posts']->json();
$comments = $responses['https://api.example.com/comments']->json();

print_r($users);
print_r($posts);
print_r($comments);

#### Curl::add() - 添加并发请求

// 带配置的并发请求
$responses = Curl::multi()
    ->add('https://api.example.com/users', 'get', timeout: 10)
    ->add('https://api.example.com/posts', 'get', timeout: 10)
    ->add('https://api.example.com/comments', 'get', timeout: 10)
    ->execute();

// 带请求体的并发请求
$responses = Curl::multi()
    ->add('https://api.example.com/users', 'post', [
        'name' => '张三'
    ])
    ->add('https://api.example.com/posts', 'post', [
        'title' => '文章标题'
    ])
    ->execute();

PHP 8.5+持久化句柄支持

Curl::sharePersistent() - 共享持久化句柄

use Kode\Curl\Curl;

// PHP 8.5+ 自动使用持久化句柄
// 持久化句柄会在请求结束时保留,避免重复初始化开销
$response1 = Curl::get('https://api.example.com/users');
$response2 = Curl::get('https://api.example.com/posts');
$response3 = Curl::get('https://api.example.com/comments');

// 多个请求复用同一个持久化句柄,提升性能

// 手动设置共享句柄选项
$response = Curl::get('https://api.example.com/users')
                ->sharePersistent()
                ->execute();

echo $response->json();

高级配置示例

上传文件

use Kode\Curl\Curl;

// 上传文件
$response = Curl::post('https://api.example.com/upload', [
    'file' => new \CURLFile('/path/to/image.jpg', 'image/jpeg', 'image.jpg'),
    'title' => '示例图片'
]);

echo $response->json();

#### 下载文件

// 下载文件
$response = Curl::get('https://api.example.com/file.zip', saveTo: '/path/to/file.zip');

if ($response->isSuccess()) {
    echo '文件下载成功';
}

#### 发送JSON数据

// 发送JSON数据
$response = Curl::post('https://api.example.com/api', [
    'key' => 'value'
], 'json');

echo $response->json();

#### 自定义请求

// 自定义请求
$response = Curl::request('DELETE', 'https://api.example.com/users/1', [
    'id' => 1
]);

echo $response->json();

二维码生成模块使用示例

二维码生成模块提供了完整的二维码生成功能,支持多种样式定制、输出格式和数据类型。

基础使用示例

create() - 创建二维码

use Kode\Qrcode\Qr;

// 基础文本二维码
$qr = Qr::create('https://example.com');
$qr->save('/path/to/qrcode.png');

#### toString() - 输出图片数据

// 直接输出图片数据
$imageData = $qr->toString();
header('Content-Type: image/png');
echo $imageData;

#### toDataUri() - 输出Base64编码

// 直接输出Base64编码
$base64 = $qr->toDataUri();
echo "<img src='{$base64}' />";

#### build() - 获取原始对象
// 获取二维码原始对象(用于进一步自定义)
$qrCode = Qr::create('https://example.com');
$builder = $qrCode->build();

样式定制

size() - 设置二维码大小

use Kode\Qrcode\Qr;

// 设置二维码大小
$qr = Qr::create('https://example.com')
        ->size(500)
        ->save('/path/to/qrcode.png');

#### margin() - 设置边距

// 设置边距
$qr = Qr::create('https://example.com')
        ->size(300)
        ->margin(20)
        ->save('/path/to/qrcode.png');

#### foregroundColor() - 设置前景色

// 设置前景色(RGB)
$qr = Qr::create('https://example.com')
        ->foregroundColor(255, 0, 0) // 红色
        ->save('/path/to/qrcode.png');

#### backgroundColor() - 设置背景色

// 设置背景色(RGB)
$qr = Qr::create('https://example.com')
        ->backgroundColor(255, 255, 0) // 黄色背景
        ->save('/path/to/qrcode.png');

// 同时设置前景和背景色
$qr = Qr::create('https://example.com')
        ->foregroundColor(0, 0, 255) // 蓝色
        ->backgroundColor(255, 255, 255) // 白色背景
        ->save('/path/to/qrcode.png');

#### errorCorrectionLevel() - 设置错误纠正级别

// 设置错误纠正级别(1-5,对应L/M/Q/H级别)
$qr = Qr::create('https://example.com')
        ->errorCorrectionLevel(5) // 最高级别H,可修复30%错误
        ->save('/path/to/qrcode.png');

#### roundDots() - 圆角点样式

// 圆角点样式
$qr = Qr::create('https://example.com')
        ->roundDots(true) // 启用圆角点
        ->save('/path/to/qrcode.png');

#### circularDots() - 圆形点样式

// 圆形点样式(带大小控制)
$qr = Qr::create('https://example.com')
        ->circularDots(true, 12) // 启用圆形点,尺寸比例12
        ->save('/path/to/qrcode.png');

#### gradient() - 渐变颜色

// 渐变颜色
$qr = Qr::create('https://example.com')
        ->gradient(
            new \Endroid\QrCode\Color\Color(255, 0, 0),     // 起始颜色(红色)
            new \Endroid\QrCode\Color\Color(0, 0, 255),     // 结束颜色(蓝色)
            'vertical' // 渐变方向:horizontal/vertical/diagonal/diagonal_inverse
        )
        ->save('/path/to/qrcode.png');

// 组合样式
$qr = Qr::create('https://example.com')
        ->size(400)
        ->margin(15)
        ->foregroundColor(0, 128, 0) // 绿色
        ->backgroundColor(240, 240, 240) // 浅灰背景
        ->errorCorrectionLevel(4) // Q级别
        ->roundDots(true)
        ->save('/path/to/qrcode.png');

Logo嵌入

logo() - 添加Logo

use Kode\Qrcode\Qr;

// 添加Logo
$qr = Qr::create('https://example.com')
        ->size(400)
        ->logo('/path/to/logo.png') // Logo图片路径
        ->save('/path/to/qrcode_with_logo.png');

// 设置Logo大小比例
$qr = Qr::create('https://example.com')
        ->size(400)
        ->logo('/path/to/logo.png', 0.3) // Logo占二维码的30%
        ->save('/path/to/qrcode_with_logo.png');

// 设置Logo大小比例和边距
$qr = Qr::create('https://example.com')
        ->size(400)
        ->logo('/path/to/logo.png', 0.25) // Logo占25%
        ->save('/path/to/qrcode_with_logo.png');

// 组合Logo和其他样式
$qr = Qr::create('https://example.com')
        ->size(500)
        ->foregroundColor(0, 0, 0)
        ->backgroundColor(255, 255, 255)
        ->errorCorrectionLevel(5) // H级别
        ->logo('/path/to/logo.png', 0.3)
        ->save('/path/to/qrcode_with_logo.png');

标签文字

label() - 添加标签

use Kode\Qrcode\Qr;

// 添加标签
$qr = Qr::create('https://example.com')
        ->size(400)
        ->label('官方网站') // 标签文字
        ->save('/path/to/qrcode_with_label.png');

// 设置标签字体大小
$qr = Qr::create('https://example.com')
        ->size(400)
        ->label('官方网站', 24) // 字体大小24px
        ->save('/path/to/qrcode_with_label.png');

// 标签文字默认显示在二维码下方,无需额外设置位置

// 组合标签和Logo
$qr = Qr::create('https://example.com')
        ->size(500)
        ->logo('/path/to/logo.png', 0.25)
        ->label('扫描访问', 20)
        ->save('/path/to/qrcode_complete.png');

多种输出格式

save() - 保存为PNG格式

use Kode\Qrcode\Qr;

// PNG格式(默认)
$qr = Qr::create('https://example.com');
$qr->save('/path/to/qrcode.png');
$pngData = $qr->toString(); // PNG二进制数据

#### asSvg() - 输出SVG格式

// SVG格式(矢量图,无限放大不失真)
$qr = Qr::create('https://example.com')
        ->asSvg() // 设置为SVG格式
        ->save('/path/to/qrcode.svg');
$svgData = $qr->toString(); // SVG字符串数据

#### asWebP() - 输出WebP格式

// WebP格式(现代图片格式,更小体积)
$qr = Qr::create('https://example.com')
        ->asWebP()
        ->save('/path/to/qrcode.webp');
$webpData = $qr->toString(); // WebP二进制数据

#### asEps() - 输出EPS格式

// EPS格式(印刷级矢量格式)
$qr = Qr::create('https://example.com')
        ->asEps()
        ->save('/path/to/qrcode.eps');
$epsData = $qr->toString(); // EPS字符串数据

#### toDataUri() - 输出Data URI

// 输出Data URI(用于HTML img标签)
$qr = Qr::create('https://example.com');
$dataUri = $qr->toDataUri(); // data:image/png;base64,...
echo "<img src='{$dataUri}' />";

// 根据用途选择格式
// PNG - 通用
// SVG - 打印、放大
// WebP - 网页加载优化
// EPS - 专业印刷

多种数据类型支持

url() - URL二维码

use Kode\Qrcode\Qr;

// URL二维码
$qr = Qr::url('https://example.com')
        ->size(300)
        ->save('/path/to/url_qr.png');

#### wifi() - WiFi二维码

// WiFi二维码
$qr = Qr::wifi('MyWiFi', 'password123', 'wpa') // WiFi名、密码、加密类型
        ->size(300)
        ->save('/path/to/wifi_qr.png');

// 隐藏WiFi
$qr = Qr::wifi('MyWiFi', 'password123', 'wpa', true) // true表示隐藏网络
        ->size(300)
        ->save('/path/to/wifi_hidden_qr.png');

#### email() - 邮件二维码

// 邮件二维码
$qr = Qr::email('user@example.com', '主题', '内容')
        ->size(300)
        ->save('/path_to/email_qr.png');

#### phone() - 电话二维码

// 电话二维码
$qr = Qr::phone('13800138000')
        ->size(300)
        ->save('/path/to/phone_qr.png');

#### sms() - 短信二维码

// 短信二维码
$qr = Qr::sms('13800138000', '您好,这是测试短信')
        ->size(300)
        ->save('/path/to/sms_qr.png');

#### geo() - 位置二维码

// 位置二维码
$qr = Qr::geo(39.9042, 116.4074) // 经度、纬度
        ->size(300)
        ->save('/path/to/geo_qr.png');

#### bitcoin() - 比特币二维码

// 比特币二维码
$qr = Qr::bitcoin('1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa', 0.5) // 地址、金额(BTC)
        ->size(300)
        ->save('/path/to/bitcoin_qr.png');

#### event() - 日历事件二维码

// 日历事件二维码
$qr = Qr::event(
        '圣诞节聚会',           // 事件标题
        '2024-12-25 10:00:00', // 开始时间
        '2024-12-25 12:00:00', // 结束时间
        '北京市朝阳区某某路'    // 地点
    )
    ->size(300)
    ->save('/path/to/calendar_qr.png');

#### vcard() - vCard名片二维码

// vCard名片二维码
$contactData = [
    'email' => 'zhangsan@example.com',
    'phone' => '13800138000',
    'org' => '示例公司',           // organization
    'title' => '工程师',
    'address' => '某某路123号'
];
$qr = Qr::vcard($contactData, '', '') // contact数组、姓、名
        ->size(300)
        ->save('/path/to/vcard_qr.png');

编码模式设置

use Kode\Qrcode\Qr;

// 自动编码(默认)
$qr = Qr::create('https://example.com');
$qr->save('/path/to/qrcode.png');

// 数字编码(纯数字)
$qr = Qr::create('1234567890')
        ->encodingMode('numeric')
        ->save('/path/to/numeric_qr.png');

// 字母数字编码
$qr = Qr::create('HELLO123')
        ->encodingMode('alphanumeric')
        ->save('/path/to/alpha_qr.png');

// 二进制编码(默认)
$qr = Qr::create('Hello World')
        ->encodingMode('byte')
        ->save('/path/to/byte_qr.png');

// 日文编码
$qr = Qr::create('こんにちは')
        ->encodingMode('kanji')
        ->save('/path/to/kanji_qr.png');

圆角块大小模式

use Kode\Qrcode\Qr;

// 最小圆角块(minus)
$qr = Qr::create('https://example.com')
        ->roundStyle('minus')
        ->save('/path/to/qrcode.png');

// 标称圆角块(nominal,默认)
$qr = Qr::create('https://example.com')
        ->roundStyle('nominal')
        ->save('/path/to/qrcode.png');

// 最大圆角块(plus)
$qr = Qr::create('https://example.com')
        ->roundStyle('plus')
        ->save('/path/to/qrcode.png');

// 极高圆角块(murky)
$qr = Qr::create('https://example.com')
        ->roundStyle('murky')
        ->save('/path/to/qrcode.png');

完整自定义示例

use Kode\Qrcode\Qr;

// 完整自定义的二维码
$qr = Qr::create('https://example.com')
    // 基本设置
    ->size(500)
    ->margin(15)
    ->errorCorrectionLevel(5) // H级别
    
    // 颜色设置
    ->foregroundColor(0, 102, 204) // 蓝色前景
    ->backgroundColor(255, 255, 255) // 白色背景
    
    // 样式设置
    ->roundDots(true)
    
    // Logo设置
    ->logo('/path/to/logo.png', 0.25)
    
    // 标签设置
    ->label('官方网站', 20) // 标签显示在二维码下方
    
    // 保存文件
    ->save('/path/to/custom_qrcode.png');

// 生成Data URI用于网页显示
$base64 = $qr->toDataUri();
echo "<img src='{$base64}' alt='二维码' />";

// 带渐变效果的二维码
$qrGradient = Qr::create('https://example.com')
    ->size(400)
    ->margin(10)
    ->errorCorrectionLevel(4) // Q级别
    ->roundDots(true)
    ->gradient(
        new \Endroid\QrCode\Color\Color(255, 87, 34),  // 橙红色
        new \Endroid\QrCode\Color\Color(33, 150, 243), // 蓝色
        'diagonal' // 对角线渐变
    )
    ->save('/path/to/gradient_qrcode.png');

// 带Logo和渐变的组合
$qrCombo = Qr::create('https://example.com')
    ->size(600)
    ->margin(20)
    ->foregroundColor(76, 175, 80) // 绿色
    ->backgroundColor(245, 245, 245) // 浅灰背景
    ->errorCorrectionLevel(5) // H级别
    ->circularDots(true, 12)
    ->logo('/path/to/logo.png', 0.3)
    ->label('扫码访问', 22)
    ->save('/path/to/combo_qrcode.png');

全局助手函数使用示例

全局助手函数提供了简化的调用方式,无需手动引入类文件即可使用。所有助手函数都遵循模块_方法的命名规范。

Helper::数组助手函数

// 获取数组第一个元素
$first = arr_first([1, 2, 3]); // 1
$first = arr_first(['a' => 1, 'b' => 2]); // 1

// 获取数组最后一个元素
$last = arr_last([1, 2, 3]); // 3
$last = arr_last(['a' => 1, 'b' => 2]); // 2

// 查找满足条件的元素
$found = arr_find([1, 2, 3, 4, 5], function($n) {
    return $n > 3;
}); // 4

// 查找满足条件的元素的键
$key = arr_find_key(['a' => 1, 'b' => 2, 'c' => 3], function($n) {
    return $n > 2;
}); // 'c'

// 数组是否存在满足条件的元素
$any = arr_any([1, 2, 3, 4, 5], function($n) {
    return $n > 3;
}); // true

// 数组是否所有元素都满足条件
$all = arr_all([1, 2, 3, 4, 5], function($n) {
    return $n > 0;
}); // true

// 数组深度合并
$array1 = ['user' => ['name' => '张三', 'age' => 25]];
$array2 = ['user' => ['age' => 26, 'email' => 'user@example.com']];
$merged = arr_deep_merge($array1, $array2);
// ['user' => ['name' => '张三', 'age' => 26, 'email' => 'user@example.com']]

// 获取数组值
$array = ['user' => ['name' => '张三', 'age' => 25]];
$value = arr_get($array, 'user.name'); // '张三'
$value = arr_get($array, 'user.email', 'default'); // 'default'

// 设置数组值
$array = arr_set($array, 'user.email', 'user@example.com');
// ['user' => ['name' => '张三', 'age' => 25, 'email' => 'user@example.com']]

// 检查数组键是否存在
$exists = arr_has($array, 'user.name'); // true
$exists = arr_has($array, 'user.phone'); // false

// 多维数组排序
$data = [
    ['name' => '张三', 'age' => 25, 'score' => 90],
    ['name' => '李四', 'age' => 22, 'score' => 85],
    ['name' => '王五', 'age' => 28, 'score' => 95]
];
$sorted = arr_multi_sort($data, ['age', 'score'], ['asc', 'desc']);
// 按年龄升序、分数降序排序

// 数组转树形结构
$list = [
    ['id' => 1, 'parent_id' => 0, 'name' => '根节点'],
    ['id' => 2, 'parent_id' => 1, 'name' => '子节点1'],
    ['id' => 3, 'parent_id' => 1, 'name' => '子节点2']
];
$tree = arr_tree($list, 'id', 'parent_id');

// 树形结构转数组
$array = arr_list($tree);

Helper::字符串助手函数

// 字符串脱敏
$masked = str_mask('13812345678', 3, 4); // '138****5678'
$masked = str_mask('user@example.com', 1, -1); // 'u***@example.com'

// 手机号脱敏
$phoneMasked = str_mask_phone('13812345678'); // '138****5678'

// 邮箱脱敏
$emailMasked = str_mask_email('user@example.com'); // 'u***@example.com'

// 身份证号脱敏
$idCardMasked = str_mask_id_card('110101199001011234'); // '110101********1234'

// 字符串截断
$truncated = str_truncate('这是一段很长的文本内容', 10); // '这是一段很长的文...'
$truncated = str_truncate('Hello World', 5, '...'); // 'Hello...'

// 字符串长度限制
$limited = str_limit('这是一段很长的文本内容', 10); // '这是一段很长的文...'

// 驼峰转下划线
$snake = str_snake('helloWorld'); // 'hello_world'
$snake = str_snake('HelloWorld'); // 'hello_world'

// 下划线转驼峰
$camel = str_camel('hello_world'); // 'helloWorld'
$camel = str_camel('hello-world', '-'); // 'helloWorld'

// 首字母大写
$studly = str_studly('hello_world'); // 'HelloWorld'

// 字符串包含判断
$contains = str_contains('hello world', 'world'); // true
$contains = str_contains('hello world', 'php'); // false

// 字符串开头判断
$startsWith = str_starts_with('hello world', 'hello'); // true
$startsWith = str_starts_with('hello world', 'world'); // false

// 字符串结尾判断
$endsWith = str_ends_with('hello world', 'world'); // true
$endsWith = str_ends_with('hello world', 'hello'); // false

// 字符串转Base64
$base64 = str_to_base64('hello'); // 'aGVsbG8='

// Base64转字符串
$decoded = str_from_base64('aGVsbG8='); // 'hello'

// 字符串转JSON
$json = str_to_json(['name' => '张三', 'age' => 25]); // '{"name":"张三","age":25}'

// JSON转字符串
$data = str_from_json('{"name":"张三","age":25}'); // ['name' => '张三', 'age' => 25]

// 字符串转数组
$array = str_to_array('a,b,c', ','); // ['a', 'b', 'c']
$array = str_to_array('a|b|c', '|'); // ['a', 'b', 'c']

// 数组转字符串
$string = str_from_array(['a', 'b', 'c'], ','); // 'a,b,c'
$string = str_from_array(['a', 'b', 'c'], '|'); // 'a|b|c'

// 生成随机字符串
$random = str_random(16); // 生成16位随机字符串

// 生成UUID
$uuid = str_uuid(); // 生成UUID v4

// 字符串转小写
$lower = str_lower('Hello World'); // 'hello world'

// 字符串转大写
$upper = str_upper('Hello World'); // 'HELLO WORLD'

// 字符串首字母大写
$ucfirst = str_ucfirst('hello world'); // 'Hello world'

// 字符串每个单词首字母大写
$ucwords = str_ucwords('hello world'); // 'Hello World'

// 字符串反转
$reversed = str_reverse('hello'); // 'olleh'

// 字符串重复
$repeated = str_repeat('hello', 3); // 'hellohellohello'

// 字符串替换
$replaced = str_replace('hello world', 'world', 'php'); // 'hello php'

// 字符串去除空格
$trimmed = str_trim('  hello world  '); // 'hello world'

// 字符串去除左侧空格
$ltrimmed = str_ltrim('  hello world  '); // 'hello world  '

// 字符串去除右侧空格
$rtrimmed = str_rtrim('  hello world  '); // '  hello world'

// 字符串长度
$length = str_length('hello'); // 5
$length = str_length('你好'); // 2(中文字符)

// 字符串转二进制
$binary = str_to_binary('hello'); // '01101000 01100101 01101100 01101100 01101111'

// 二进制转字符串
$string = str_from_binary('01101000 01100101 01101100 01101100 01101111'); // 'hello'

// 字符串转十六进制
$hex = str_to_hex('hello'); // '68656c6c6f'

// 十六进制转字符串
$string = str_from_hex('68656c6c6f'); // 'hello'

// 字符串MD5哈希
$md5 = str_md5('hello'); // '5d41402abc4b2a76b9719d911017c592'

// 字符串SHA1哈希
$sha1 = str_sha1('hello'); // 'aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d'

// 字符串SHA256哈希
$sha256 = str_sha256('hello'); // '2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824'

// 字符串验证
$isEmail = str_is_email('user@example.com'); // true
$isPhone = str_is_phone('13812345678'); // true
$isIdCard = str_is_id_card('110101199001011234'); // true
$isUrl = str_is_url('https://example.com'); // true
$isIp = str_is_ip('192.168.1.1'); // true

// 字符串相似度
$similarity = str_similarity('hello', 'hello'); // 1.0
$similarity = str_similarity('hello', 'world'); // 0.2

// 字符串编辑距离
$distance = str_distance('hello', 'hello'); // 0
$distance = str_distance('hello', 'world'); // 4

Helper::时间助手函数

// 获取当前时间
$now = time_now(); // '2025-12-26 12:00:00'
$now = time_now('Y-m-d'); // '2025-12-26'

// 格式化时间
$formatted = time_format(time(), 'Y-m-d H:i:s'); // '2025-12-26 12:00:00'

// 人性化时间差
$human = time_human(time() - 60); // '1分钟前'
$human = time_human(time() - 3600); // '1小时前'
$human = time_human(time() - 86400); // '1天前'

// 获取今天日期
$today = time_today(); // '2025-12-26'
$today = time_today('Y-m-d H:i:s'); // '2025-12-26 00:00:00'

// 获取昨天日期
$yesterday = time_yesterday(); // '2025-12-25'

// 获取明天日期
$tomorrow = time_tomorrow(); // '2025-12-27'

// 获取本周开始时间
$weekStart = time_week_start(); // 本周一00:00:00的时间戳
$weekStartFormatted = time_format(time_week_start(), 'Y-m-d H:i:s'); // '2025-12-22 00:00:00'

// 获取本周结束时间
$weekEnd = time_week_end(); // 本周日23:59:59的时间戳
$weekEndFormatted = time_format(time_week_end(), 'Y-m-d H:i:s'); // '2025-12-28 23:59:59'

// 获取上周开始时间
$lastWeekStart = time_last_week_start(); // 上周一00:00:00的时间戳

// 获取上周结束时间
$lastWeekEnd = time_last_week_end(); // 上周日23:59:59的时间戳

// 获取本月开始时间
$monthStart = time_month_start(); // 本月1日00:00:00的时间戳
$monthStartFormatted = time_format(time_month_start(), 'Y-m-d H:i:s'); // '2025-12-01 00:00:00'

// 获取本月结束时间
$monthEnd = time_month_end(); // 本月最后一天23:59:59的时间戳
$monthEndFormatted = time_format(time_month_end(), 'Y-m-d H:i:s'); // '2025-12-31 23:59:59'

// 获取上月开始时间
$lastMonthStart = time_last_month_start(); // 上月1日00:00:00的时间戳

// 获取上月结束时间
$lastMonthEnd = time_last_month_end(); // 上月最后一天23:59:59的时间戳

// 获取本年开始时间
$yearStart = time_year_start(); // 本年1月1日00:00:00的时间戳
$yearStartFormatted = time_format(time_year_start(), 'Y-m-d H:i:s'); // '2025-01-01 00:00:00'

// 获取本年结束时间
$yearEnd = time_year_end(); // 本年12月31日23:59:59的时间戳
$yearEndFormatted = time_format(time_year_end(), 'Y-m-d H:i:s'); // '2025-12-31 23:59:59'

// 获取上年开始时间
$lastYearStart = time_last_year_start(); // 上年1月1日00:00:00的时间戳

// 获取上年结束时间
$lastYearEnd = time_last_year_end(); // 上年12月31日23:59:59的时间戳

// 计算年龄
$age = time_age('1990-01-01'); // 35(假设当前是2025年)

// 判断是否是今天
$isToday = time_is_today(time()); // true

// 判断是否是昨天
$isYesterday = time_is_yesterday(time() - 86400); // true

// 判断是否是明天
$isTomorrow = time_is_tomorrow(time() + 86400); // true

// 判断是否是本周
$isThisWeek = time_is_this_week(time()); // true

// 判断是否是本月
$isThisMonth = time_is_this_month(time()); // true

// 判断是否是本年
$isThisYear = time_is_this_year(time()); // true

// 获取某个月的天数
$days = time_days_in_month(12); // 31
$days = time_days_in_month(2, 2024); // 29(闰年)

// 获取某天是周几
$weekday = time_day_of_week(time()); // 0-6(0表示周日)
$weekdayName = time_day_of_week_name(time()); // '周五'

// 获取某天是本年第几天
$dayOfYear = time_day_of_year(time()); // 360

// 获取某天是本年第几周
$weekOfYear = time_week_of_year(time()); // 52

// 时间字符串转时间戳
$timestamp = time_to_timestamp('2025-12-26 12:00:00'); // 1735200000

// 时间戳转毫秒
$millisecond = time_to_millisecond(time()); // 1735200000000

// 毫秒转时间戳
$timestamp = time_from_millisecond(1735200000000); // 1735200000

// 获取当前毫秒时间戳
$millisecond = time_millisecond(); // 当前时间的毫秒时间戳

// 获取当前微秒时间戳
$microsecond = time_microsecond(); // 当前时间的微秒时间戳

// 获取当前时间戳(带微秒)
$microtime = time_microtime(); // 1735200000.123456

// 获取当前时区
$timezone = time_timezone(); // 'Asia/Shanghai'

// 设置时区
time_set_timezone('UTC'); // 设置时区为UTC

Helper::数学助手函数

// 高精度加法
$result = math_add('1.1', '2.2'); // '3.3'
$result = math_add('1.1', '2.2', 2); // '3.30'

// 高精度减法
$result = math_sub('3.3', '1.1'); // '2.2'
$result = math_sub('3.3', '1.1', 2); // '2.20'

// 高精度乘法
$result = math_mul('1.5', '2'); // '3.0'
$result = math_mul('1.5', '2', 2); // '3.00'

// 高精度除法
$result = math_div('6', '2'); // '3'
$result = math_div('10', '3', 2); // '3.33'

// 取模运算
$result = math_mod(10, 3); // 1

// 幂运算
$result = math_pow(2, 10); // 1024

// 平方根运算
$result = math_sqrt(16); // 4

// 四舍五入
$result = math_round(3.14159, 2); // 3.14

// 向上取整
$result = math_ceil(3.2); // 4

// 向下取整
$result = math_floor(3.8); // 3

// 绝对值
$result = math_abs(-10); // 10

// 最大值
$result = math_max(1, 3, 2); // 3

// 最小值
$result = math_min(1, 3, 2); // 1

// 求和
$result = math_sum([1, 2, 3, 4, 5]); // 15

// 平均值
$result = math_avg([1, 2, 3, 4, 5]); // 3

// 中位数
$result = math_median([1, 2, 3, 4, 5]); // 3

// 标准差
$result = math_std_dev([1, 2, 3, 4, 5]); // 1.414

// 计算折扣价
$result = math_discount(100, 0.2); // 80(打8折)

// 计算税额
$result = math_tax(100, 0.13); // 13(13%税)

// 计算利润率
$result = math_profit_rate(100, 80); // 0.25

// 计算增长率
$result = math_growth_rate(100, 120); // 0.2

// 计算复利
$result = math_compound_interest(1000, 0.05, 12); // 1795.86

// 计算简单利息
$result = math_simple_interest(1000, 0.05, 12); // 600

// 计算分期付款
$result = math_installment(10000, 0.005, 12); // 861.85

// 计算现值
$result = math_present_value(10000, 0.005, 12); // 9419.05

// 计算未来值
$result = math_future_value(1000, 0.005, 12); // 1061.68

// 判断是否为素数
$result = math_is_prime(7); // true

// 计算阶乘
$result = math_factorial(5); // 120

// 计算最大公约数
$result = math_gcd(12, 18); // 6

// 计算最小公倍数
$result = math_lcm(4, 6); // 12

// 格式化数字
$result = math_format(1234567.89, 2, true); // 1,234,567.89

Helper::加密助手函数

// MD5加密(支持加盐)
$md5 = crypto_md5('123456', 'salt123'); // 加盐MD5

// 密码哈希
$hash = crypto_password_hash('123456'); // 密码哈希

// 密码验证
$verify = crypto_password_verify('123456', $hash); // true

// SSL加密
$encrypted = crypto_ssl_encrypt('敏感数据', '1234567890abcdef'); // 加密

// SSL解密
$decrypted = crypto_ssl_decrypt($encrypted, '1234567890abcdef'); // 解密

// HMAC签名
$hmac = crypto_hmac('数据', 'key', 'sha256'); // HMAC签名

Helper::地理位置助手函数

// 计算两点距离(米)
$distance = geo_distance(39.9042, 116.4074, 31.2304, 121.4737); // 米

// 计算两点距离(公里)
$distanceKm = geo_distance_km(39.9042, 116.4074, 31.2304, 121.4737); // 公里

// 验证纬度
$validLat = geo_validate_lat(39.9042); // true

// 验证经度
$validLon = geo_validate_lon(116.4074); // true

// 验证坐标
$validCoord = geo_validate_coord(39.9042, 116.4074); // true

Helper::IP地址助手函数

// 获取客户端IP
$ip = ip_get(); // 客户端IP

// 验证IP地址
$valid = ip_validate('192.168.1.1'); // true

// 是否为私有IP
$private = ip_is_private('192.168.1.1'); // true

// 是否为公网IP
$public = ip_is_public('8.8.8.8'); // true

// IP地址转长整型
$long = ip_to_long('192.168.1.1'); // 3232235777

// 长整型转IP地址
$ipStr = ip_to_string(3232235777); // '192.168.1.1'

实际应用场景

// 订单时间显示
$createdAt = time() - 3600;
$displayTime = time_human($createdAt); // '1小时前'

// 数据统计
$weekStart = time_week_start();
$weekEnd = time_week_end();
// 查询本周数据:WHERE created_at >= $weekStart AND created_at <= $weekEnd

// 用户信息脱敏
$phoneMasked = str_mask_phone('13812345678'); // '138****5678'
$emailMasked = str_mask_email('user@example.com'); // 'u***@example.com'

// 金额计算
$subtotal = math_add('99.99', '49.99'); // 149.98
$discount = math_discount($subtotal, '0.9'); // 134.98
$tax = math_tax($discount, '0.13'); // 17.55
$total = math_add($discount, $tax, 2); // 152.53

// 距离计算
$distance = geo_distance_km(39.9042, 116.4074, 31.2304, 121.4737); // 约1067公里

// IP地址处理
$ip = ip_get();
if (ip_is_private($ip)) {
    // 内网IP
} else {
    // 公网IP
}

// 数组操作
$data = ['user' => ['name' => '张三', 'age' => 25]];
$name = arr_get($data, 'user.name'); // '张三'
$data = arr_set($data, 'user.email', 'user@example.com');

// 字符串处理
$random = str_random(16); // 生成随机字符串
$uuid = str_uuid(); // 生成UUID
$base64 = str_to_base64('hello'); // 'aGVsbG8='

## 基本使用

### 数组处理使用示例

```php
use Kode\Array\Arr;

// 数组转树形结构
$list = [
    ['id' => 1, 'parent_id' => 0, 'name' => '根节点'],
    ['id' => 2, 'parent_id' => 1, 'name' => '子节点1'],
    ['id' => 3, 'parent_id' => 1, 'name' => '子节点2'],
    ['id' => 4, 'parent_id' => 2, 'name' => '孙节点1']
];

$tree = Arr::tree($list);
// 输出:
// [
//     'id' => 1,
//     'parent_id' => 0,
//     'name' => '根节点',
//     'children' => [
//         ['id' => 2, 'parent_id' => 1, 'name' => '子节点1', 'children' => [['id' => 4, 'parent_id' => 2, 'name' => '孙节点1', 'children' => []]]],
//         ['id' => 3, 'parent_id' => 1, 'name' => '子节点2', 'children' => []]
//     ]
// ]

// 树形结构转数组
$array = Arr::list($tree);

// 数组转层级结构
$levelList = Arr::level($list);

// 数组转路径结构
$pathList = Arr::path($list);

// 数组操作
$value = Arr::get($array, 'key', 'default');
$array = Arr::set($array, 'key', 'value');
$exists = Arr::has($array, 'key');
$only = Arr::only($array, ['key1', 'key2']);
$except = Arr::except($array, ['key1', 'key2']);

// 数组深度合并
$array1 = [
    'user' => [
        'name' => '张三',
        'age' => 25
    ],
    'settings' => [
        'theme' => 'dark'
    ]
];

$array2 = [
    'user' => [
        'age' => 26,
        'email' => 'user@example.com'
    ],
    'settings' => [
        'language' => 'zh-CN'
    ]
];

$merged = Arr::deepMerge($array1, $array2);
// 输出:
// [
//     'user' => [
//         'name' => '张三',
//         'age' => 26,
//         'email' => 'user@example.com'
//     ],
//     'settings' => [
//         'theme' => 'dark',
//         'language' => 'zh-CN'
//     ]
// ]

// 多维数组排序
$data = [
    ['name' => '张三', 'age' => 25, 'score' => 90],
    ['name' => '李四', 'age' => 22, 'score' => 85],
    ['name' => '王五', 'age' => 28, 'score' => 95]
];

// 按年龄升序,分数降序排序
$sorted = Arr::multiSort($data, ['age', 'score'], ['asc', 'desc']);
// 输出:
// [
//     ['name' => '李四', 'age' => 22, 'score' => 85],
//     ['name' => '张三', 'age' => 25, 'score' => 90],
//     ['name' => '王五', 'age' => 28, 'score' => 95]
// ]

// 多维数组去重
$data = [
    ['id' => 1, 'name' => '张三'],
    ['id' => 2, 'name' => '李四'],
    ['id' => 1, 'name' => '张三']
];

$unique = Arr::multiUnique($data, 'id');
// 输出:
// [
//     ['id' => 1, 'name' => '张三'],
//     ['id' => 2, 'name' => '李四']
// ]

// 数组首元素(PHP 8.4+使用原生array_first)
$first = Arr::first([1, 2, 3, 4, 5]); // 1

// 数组尾元素(PHP 8.4+使用原生array_last)
$last = Arr::last([1, 2, 3, 4, 5]); // 5

// 查找满足条件的元素
$found = Arr::find([1, 2, 3, 4, 5], fn($n) => $n > 2); // 3

// 查找满足条件的元素键名
$foundKey = Arr::findKey(['a' => 1, 'b' => 2, 'c' => 3], fn($n) => $n > 1); // 'b'

// 检查是否存在满足条件的元素(PHP 8.4+使用原生array_any)
$hasAny = Arr::any([1, 2, 3, 4, 5], fn($n) => $n > 3); // true

// 检查是否所有元素都满足条件(PHP 8.4+使用原生array_all)
$allMatch = Arr::all([1, 2, 3, 4, 5], fn($n) => $n > 0); // true

字符串处理使用示例

use Kode\String\Str;

// 生成随机字符串
$random = Str::random(16);

// 生成UUID
$uuid = Str::uuid();

// 命名转换
$camel = Str::camel('hello-world'); // helloWorld
$snake = Str::snake('helloWorld'); // hello_world
$studly = Str::studly('hello-world'); // HelloWorld

// 字符串处理
$escaped = Str::escape('Hello "World"'); // Hello \"World\"
$unescaped = Str::unescape('Hello \"World\"'); // Hello "World"
$trimmed = Str::trim('  Hello World  '); // Hello World

// 字符串脱敏(默认参数)
$maskedPhone = Str::maskPhone('13800138000'); // 138****8000
$maskedIdCard = Str::maskIdCard('110101199003074567'); // 110101********4567
$maskedEmail = Str::maskEmail('user@example.com'); // us********@example.com
$maskedBankCard = Str::maskBankCard('6222021234567890'); // 622202********7890
$maskedCarPlate = Str::maskCarPlate('京A12345'); // 京A***45
$maskedName = Str::maskName('张三'); // 张*

// 字符串脱敏(自定义参数)
$maskedPhoneCustom = Str::maskPhone('13800138000', 2, 2); // 13****00
$maskedIdCardCustom = Str::maskIdCard('110101199003074567', 4, 2); // 1101**********67
$maskedEmailCustom = Str::maskEmail('user@example.com', 3); // use*******@example.com
$maskedBankCardCustom = Str::maskBankCard('6222021234567890', 4, 2); // 6222**********90
$maskedCarPlateCustom = Str::maskCarPlate('京A12345', 1, 1); // 京****5
$maskedNameCustom = Str::maskName('张三', 2); // 张三(不脱敏)

// 字符串验证
$isPhone = Str::validatePhone('13800138000'); // true
$isIdCard = Str::validateIdCard('110101199003074567'); // true
$isEmail = Str::validateEmail('user@example.com'); // true
$isCarPlate = Str::validateCarPlate('京A12345'); // true
$isBankCard = Str::validateBankCard('6222021234567890'); // true

// 收货地址解析
$address = "张三 13800138000 北京市朝阳区建国路88号 100020";
$parsed = Str::parseAddress($address);
// 输出:
// [
//     'name' => '张三',
//     'phone' => '13800138000',
//     'province' => '北京市',
//     'city' => '市',
//     'district' => '朝阳区',
//     'detail' => '建国路88号',
//     'zip' => '100020'
// ]

// 字符串截断
$truncated = Str::truncate('这是一段很长的文本内容', 10); // 这是一段很...

// 字符串限制
$limited = Str::limit('这是一段很长的文本内容', 10); // 这是一段很...

// 驼峰转下划线
$snake = Str::snake('helloWorld'); // hello_world

// 下划线转驼峰
$camel = Str::camel('hello_world'); // helloWorld

// 字符串是否包含
$contains = Str::contains('hello world', 'world'); // true

// 字符串是否以开头
$startsWith = Str::startsWith('hello world', 'hello'); // true

// 字符串是否以结尾
$endsWith = Str::endsWith('hello world', 'world'); // true

// 字符串替换多个
$replaced = Str::replaceArray('Hello :name, welcome to :place', [':name' => '张三', ':place' => '北京']); // Hello 张三, welcome to 北京

// 字符串删除
$removed = Str::remove('hello world', 'world'); // hello 

// 字符串删除多个
$removedArray = Str::removeArray('hello world', ['hello', 'world']); //  

// 字符串连接
$joined = Str::join(['a', 'b', 'c'], '-'); // a-b-c

// 字符串去重
$unique = Str::unique('aabbccdd'); // abcd

// 字符串打乱
$shuffled = Str::shuffle('abcde'); // 随机打乱

// 字符串截取
$sub = Str::substr('hello world', 0, 5); // hello

// 字符串截取多字节
$mbSub = Str::mbSubstr('你好世界', 0, 2); // 你好

// 字符串长度
$length = Str::length('hello'); // 5

// 字符串多字节长度
$mbLength = Str::mbLength('你好'); // 2

// 字符串转二进制
$binary = Str::toBinary('hello'); // 0110100001100101011011000110110001101111

// 二进制转字符串
$fromBinary = Str::fromBinary('0110100001100101011011000110110001101111'); // hello

// 字符串转十六进制
$hex = Str::toHex('hello'); // 68656c6c6f

// 十六进制转字符串
$fromHex = Str::fromHex('68656c6c6f'); // hello

// 字符串转Base64
$base64 = Str::toBase64('hello'); // aGVsbG8=

// Base64转字符串
$fromBase64 = Str::fromBase64('aGVsbG8='); // hello

// 字符串转URL编码
$urlEncoded = Str::toUrlEncode('hello world'); // hello%20world

// URL编码转字符串
$urlDecoded = Str::fromUrlDecode('hello%20world'); // hello world

// 字符串压缩
$compressed = Str::compress('这是一段需要压缩的文本内容');

// 字符串解压
$decompressed = Str::decompress($compressed);

地理位置处理使用示例

use Kode\Geo\Geo;

// 计算两点间距离(单位:千米)
$distance = Geo::distance(39.9042, 116.4074, 31.2304, 121.4737); // 北京到上海的距离

// 计算两点间距离(单位:米)
$distanceMeters = Geo::distance(39.9042, 116.4074, 31.2304, 121.4737, 'm'); // 北京到上海的距离(米)

// 验证经度
$isValidLng = Geo::isValidLng(116.4074); // true

// 验证纬度
$isValidLat = Geo::isValidLat(39.9042); // true

// 验证坐标
$isValidCoordinate = Geo::isValidCoordinate(39.9042, 116.4074); // true

// 经度转DMS格式
$lngDms = Geo::lngToDms(116.4074); // 116°24'26.64"E

// 纬度转DMS格式
$latDms = Geo::latToDms(39.9042); // 39°54'15.12"N

// DMS格式转经度
$lng = Geo::dmsToLng('116°24\'26.64"E'); // 116.4074

// DMS格式转纬度
$lat = Geo::dmsToLat('39°54\'15.12"N'); // 39.9042

// 计算中点坐标
$midpoint = Geo::midpoint(39.9042, 116.4074, 31.2304, 121.4737);
// 输出: ['lat' => 35.5673, 'lng' => 118.9406]

// 计算方位角
$bearing = Geo::bearing(39.9042, 116.4074, 31.2304, 121.4737); // 121.5度

// 根据方位角和距离计算目标坐标
$target = Geo::destination(39.9042, 116.4074, 121.5, 1000);
// 输出: ['lat' => 39.9135, 'lng' => 116.4183]

// 计算多边形面积(单位:平方千米)
$area = Geo::area([
    [39.9042, 116.4074],
    [39.9142, 116.4174],
    [39.8942, 116.4174],
    [39.8942, 116.3974]
]); // 约0.1平方千米

// 判断点是否在多边形内
$pointInPolygon = Geo::pointInPolygon(39.9042, 116.4074, [
    [39.9042, 116.4074],
    [39.9142, 116.4174],
    [39.8942, 116.4174],
    [39.8942, 116.3974]
]); // true

// 计算多边形周长(单位:千米)
$perimeter = Geo::perimeter([
    [39.9042, 116.4074],
    [39.9142, 116.4174],
    [39.8942, 116.4174],
    [39.8942, 116.3974]
]); // 约0.04千米

IP地址处理使用示例

use Kode\Ip\Ip;

// 获取客户端IP地址
$ip = Ip::getClientIp(); // 192.168.1.1

// 获取客户端IP地址(支持代理)
$ip = Ip::getClientIp(true); // 获取真实IP

// 验证IP地址
$isValidIp = Ip::isValid('192.168.1.1'); // true

// 验证IPv4地址
$isValidIpv4 = Ip::isValidV4('192.168.1.1'); // true

// 验证IPv6地址
$isValidIpv6 = Ip::isValidV6('2001:0db8:85a3:0000:0000:8a2e:0370:7334'); // true

// 判断是否为内网IP
$isPrivate = Ip::isPrivate('192.168.1.1'); // true

// 判断是否为公网IP
$isPublic = Ip::isPublic('8.8.8.8'); // true

// 判断是否为保留IP
$isReserved = Ip::isReserved('127.0.0.1'); // true

// 判断是否为本地回环IP
$isLoopback = Ip::isLoopback('127.0.0.1'); // true

// 判断是否为多播IP
$isMulticast = Ip::isMulticast('224.0.0.1'); // true

// 判断是否为链路本地IP
$isLinkLocal = Ip::isLinkLocal('169.254.1.1'); // true

// 获取IP地址类型
$ipType = Ip::getType('192.168.1.1'); // 'ipv4'

// 获取IP地址版本
$ipVersion = Ip::getVersion('192.168.1.1'); // 4

// 获取IP地址的整数表示
$ipLong = Ip::toLong('192.168.1.1'); // 3232235777

// 从整数表示获取IP地址
$ip = Ip::fromLong(3232235777); // '192.168.1.1'

// 获取IP地址的网络地址
$network = Ip::network('192.168.1.1', 24); // '192.168.1.0'

// 获取IP地址的广播地址
$broadcast = Ip::broadcast('192.168.1.1', 24); // '192.168.1.255'

// 获取IP地址的子网掩码
$netmask = Ip::netmask(24); // '255.255.255.0'

// 判断两个IP地址是否在同一网段
$isSameNetwork = Ip::inSameNetwork('192.168.1.1', '192.168.1.2', 24); // true

// 获取IP地址的CIDR表示
$cidr = Ip::toCidr('192.168.1.0', 24); // '192.168.1.0/24'

// 从CIDR获取网络地址和子网掩码
$cidrInfo = Ip::fromCidr('192.168.1.0/24');
// 输出: ['network' => '192.168.1.0', 'netmask' => '255.255.255.0']

// 获取IP地址的可用范围
$ipRange = Ip::range('192.168.1.0', 24);
// 输出: ['start' => '192.168.1.1', 'end' => '192.168.1.254']

// 获取IP地址的可用数量
$ipCount = Ip::count('192.168.1.0', 24); // 254

// 获取IP地址的地理位置(需要IP地理位置数据库)
$location = Ip::location('8.8.8.8');
// 输出: ['country' => 'United States', 'city' => 'Mountain View', ...]

// 获取IP地址的ISP(需要IP地理位置数据库)
$isp = Ip::isp('8.8.8.8'); // 'Google LLC'

全局辅助函数使用示例

// 引入全局辅助函数
require __DIR__ . '/vendor/autoload.php';

// 数组辅助函数
$first = arr_first([1, 2, 3, 4, 5]); // 1
$last = arr_last([1, 2, 3, 4, 5]); // 5
$found = arr_find([1, 2, 3, 4, 5], fn($n) => $n > 2); // 3
$foundKey = arr_find_key(['a' => 1, 'b' => 2], fn($n) => $n > 1); // 'b'
$hasAny = arr_any([1, 2, 3, 4, 5], fn($n) => $n > 3); // true
$allMatch = arr_all([1, 2, 3, 4, 5], fn($n) => $n > 0); // true

// 字符串辅助函数
$truncated = str_truncate('这是一段很长的文本内容', 10); // 这是一段很...
$limited = str_limit('这是一段很长的文本内容', 10); // 这是一段很...
$snake = str_snake('helloWorld'); // hello_world
$contains = str_contains('hello world', 'world'); // true
$startsWith = str_starts_with('hello world', 'hello'); // true
$endsWith = str_ends_with('hello world', 'world'); // true
$replaced = str_replace_array('Hello :name', [':name' => '张三']); // Hello 张三
$removed = str_remove('hello world', 'world'); // hello 
$joined = str_join(['a', 'b', 'c'], '-'); // a-b-c
$unique = str_unique('aabbccdd'); // abcd
$shuffled = str_shuffle('abcde'); // 随机打乱
$sub = str_substr('hello world', 0, 5); // hello
$mbSub = str_mb_substr('你好世界', 0, 2); // 你好
$length = str_length('hello'); // 5
$mbLength = str_mb_length('你好'); // 2
$binary = str_to_binary('hello'); // 01101000...
$fromBinary = str_from_binary('01101000...'); // hello
$hex = str_to_hex('hello'); // 68656c6c6f
$fromHex = str_from_hex('68656c6c6f'); // hello
$base64 = str_to_base64('hello'); // aGVsbG8=
$fromBase64 = str_from_base64('aGVsbG8='); // hello
$urlEncoded = str_to_url_encode('hello world'); // hello%20world
$urlDecoded = str_from_url_decode('hello%20world'); // hello world
$compressed = str_compress('这是一段需要压缩的文本内容');
$decompressed = str_decompress($compressed);

// 时间辅助函数
$now = time_now(); // 当前时间戳
$today = time_today(); // 今天日期
$yesterday = time_yesterday(); // 昨天日期
$tomorrow = time_tomorrow(); // 明天日期
$diff = time_diff($start, $end); // 时间差
$format = time_format(time()); // 格式化时间

// 地理位置辅助函数
$distance = geo_distance(39.9042, 116.4074, 31.2304, 121.4737); // 距离
$isValidLng = geo_is_valid_lng(116.4074); // 验证经度
$isValidLat = geo_is_valid_lat(39.9042); // 验证纬度

// IP地址辅助函数
$ip = ip_get_client_ip(); // 获取客户端IP
$isValidIp = ip_is_valid('192.168.1.1'); // 验证IP
$isPrivate = ip_is_private('192.168.1.1'); // 是否为内网IP
$isPublic = ip_is_public('8.8.8.8'); // 是否为公网IP

// 消息体辅助函数
$result = msg_result(200, '操作成功', ['id' => 123]); // 返回结果数组
$json = msg_json(200, '操作成功', ['id' => 123]); // 返回JSON字符串

// 加解密辅助函数
$encrypted = crypto_encrypt('敏感数据'); // 加密
$decrypted = crypto_decrypt($encrypted); // 解密
$orderNo = crypto_order('ORD'); // 生成订单号
$inviteCode = crypto_invite(6); // 生成邀请码
$urlSafeCode = crypto_url(16); // 生成URL安全码
$regCode = crypto_reg(16, 4, '-'); // 生成注册码

// 数学辅助函数
$sum = math_sum([1, 2, 3, 4, 5]); // 求和
$avg = math_avg([1, 2, 3, 4, 5]); // 平均值
$round = math_round(3.14159, 2); // 四舍五入
$ceil = math_ceil(3.2); // 向上取整
$floor = math_floor(3.8); // 向下取整
$max = math_max([1, 2, 3, 4, 5]); // 最大值
$min = math_min([1, 2, 3, 4, 5]); // 最小值
$random = math_random(1, 100); // 随机数
use Kode\Time\Time;

// 时间格式化
$now = Time::now(); // 2025-07-01 12:34:56
$formatted = Time::format(time(), 'Y-m-d'); // 2025-07-01

// 时间计算
$tomorrow = Time::add(time(), 86400);
$yesterday = Time::sub(time(), 86400);
$diff = Time::diff($start, $end);

// 常用时间获取
$today = Time::today(); // 2025-07-01
$yesterday = Time::yesterday(); // 2025-06-30
$tomorrow = Time::tomorrow(); // 2025-07-02

// 本周时间
$thisWeek = Time::thisWeek(); // ['start' => '2025-06-30', 'end' => '2025-07-06']

// 本月时间
$thisMonth = Time::thisMonth(); // ['start' => '2025-07-01', 'end' => '2025-07-31']

// 本季度时间
$thisQuarter = Time::thisQuarter(); // ['start' => '2025-07-01', 'end' => '2025-09-30']

// 本年时间
$thisYear = Time::thisYear(); // ['start' => '2025-01-01', 'end' => '2025-12-31']

// 上周时间
$lastWeek = Time::lastWeek(); // ['start' => '2025-06-23', 'end' => '2025-06-29']

// 上月时间
$lastMonth = Time::lastMonth(); // ['start' => '2025-06-01', 'end' => '2025-06-30']

// 上季度时间
$lastQuarter = Time::lastQuarter(); // ['start' => '2025-04-01', 'end' => '2025-06-30']

// 去年时间
$lastYear = Time::lastYear(); // ['start' => '2024-01-01', 'end' => '2024-12-31']

// 获取日期范围
$dateRange = Time::getDateRange('2025-01-01', '2025-01-31'); // ['2025-01-01', '2025-01-02', ..., '2025-01-31']

// 获取月份日期
$monthDates = Time::getMonthDates(2025, 1); // ['2025-01-01', '2025-01-02', ..., '2025-01-31']

// 获取季度日期
$quarterDates = Time::getQuarterDates(2025, 1); // ['2025-01-01', '2025-01-02', ..., '2025-03-31']

// 获取年份日期
$yearDates = Time::getYearDates(2025); // ['2025-01-01', '2025-01-02', ..., '2025-12-31']

// 人性化时间差
$humanDiff = Time::humanDiff(time() - 3600); // 1小时前

// 时间戳转日期
$toDate = Time::toDate(time()); // 2025-07-01

// 时间戳转时间
$toTime = Time::toTime(time()); // 12:34:56

// 时间戳转日期时间
$toDateTime = Time::toDateTime(time()); // 2025-07-01 12:34:56

// 日期转时间戳
$toTimestamp = Time::toTimestamp('2025-07-01 12:34:56'); // 1719815696

// 判断是否为今天
$isToday = Time::isToday(time()); // true

// 判断是否为昨天
$isYesterday = Time::isYesterday(time() - 86400); // true

// 判断是否为本周
$isThisWeek = Time::isThisWeek(time()); // true

// 判断是否为本月
$isThisMonth = Time::isThisMonth(time()); // true

// 判断是否为本年
$isThisYear = Time::isThisYear(time()); // true

// 获取星期几
$dayOfWeek = Time::dayOfWeek(time()); // 1(周一)

// 获取星期几名称
$dayOfWeekName = Time::dayOfWeekName(time()); // 周一

// 获取月份名称
$monthName = Time::monthName(time()); // 七月

// 获取季度
$quarter = Time::quarter(time()); // 3

// 获取季度名称
$quarterName = Time::quarterName(time()); // 第三季度

// 获取年份
$year = Time::year(time()); // 2025

// 获取月份
$month = Time::month(time()); // 7

// 获取日期
$day = Time::day(time()); // 1

// 获取小时
$hour = Time::hour(time()); // 12

// 获取分钟
$minute = Time::minute(time()); // 34

// 获取秒数
$second = Time::second(time()); // 56

// 获取月份天数
$daysInMonth = Time::daysInMonth(2025, 7); // 31

// 获取季度天数
$daysInQuarter = Time::daysInQuarter(2025, 3); // 92

// 获取年份天数
$daysInYear = Time::daysInYear(2025); // 365

// 判断是否为闰年
$isLeapYear = Time::isLeapYear(2025); // false

// 判断是否为工作日
$isWorkday = Time::isWorkday(time()); // true

// 判断是否为周末
$isWeekend = Time::isWeekend(time()); // false

// 获取工作日
$workdays = Time::getWorkdays('2025-07-01', '2025-07-31'); // ['2025-07-01', '2025-07-02', ..., '2025-07-31']

// 获取周末日期
$weekends = Time::getWeekends('2025-07-01', '2025-07-31'); // ['2025-07-05', '2025-07-06', ..., '2025-07-26', '2025-07-27']

// 计算工作日
$workdayCount = Time::countWorkdays('2025-07-01', '2025-07-31'); // 23

// 计算周末天数
$weekendCount = Time::countWeekends('2025-07-01', '2025-07-31'); // 8

// 计算两个日期之间的天数
$daysBetween = Time::daysBetween('2025-07-01', '2025-07-31'); // 30

// 计算两个日期之间的工作日
$workdaysBetween = Time::workdaysBetween('2025-07-01', '2025-07-31'); // 23

// 计算两个日期之间的周末天数
$weekendsBetween = Time::weekendsBetween('2025-07-01', '2025-07-31'); // 8

// 计算两个日期之间的月数
$monthsBetween = Time::monthsBetween('2025-01-01', '2025-07-01'); // 6

// 计算两个日期之间的年数
$yearsBetween = Time::yearsBetween('2020-01-01', '2025-01-01'); // 5

// 计算两个日期之间的季度数
$quartersBetween = Time::quartersBetween('2025-01-01', '2025-07-01'); // 2

// 计算两个日期之间的周数
$weeksBetween = Time::weeksBetween('2025-07-01', '2025-07-31'); // 4

// 计算两个日期之间的小时数
$hoursBetween = Time::hoursBetween('2025-07-01 00:00:00', '2025-07-01 12:00:00'); // 12

// 计算两个日期之间的分钟数
$minutesBetween = Time::minutesBetween('2025-07-01 00:00:00', '2025-07-01 01:00:00'); // 60

// 计算两个日期之间的秒数
$secondsBetween = Time::secondsBetween('2025-07-01 00:00:00', '2025-07-01 01:00:00'); // 3600

// 获取月份第一天
$firstDayOfMonth = Time::firstDayOfMonth(2025, 7); // 2025-07-01

// 获取月份最后一天
$lastDayOfMonth = Time::lastDayOfMonth(2025, 7); // 2025-07-31

// 获取季度第一天
$firstDayOfQuarter = Time::firstDayOfQuarter(2025, 3); // 2025-07-01

// 获取季度最后一天
$lastDayOfQuarter = Time::lastDayOfQuarter(2025, 3); // 2025-09-30

// 获取年份第一天
$firstDayOfYear = Time::firstDayOfYear(2025); // 2025-01-01

// 获取年份最后一天
$lastDayOfYear = Time::lastDayOfYear(2025); // 2025-12-31

// 获取周第一天
$firstDayOfWeek = Time::firstDayOfWeek(time()); // 2025-06-30

// 获取周最后一天
$lastDayOfWeek = Time::lastDayOfWeek(time()); // 2025-07-06

// 获取下个月
$nextMonth = Time::nextMonth(time()); // 2025-08

// 获取上个月
$prevMonth = Time::prevMonth(time()); // 2025-06

// 获取明年
$nextYear = Time::nextYear(time()); // 2026

// 获取去年
$prevYear = Time::prevYear(time()); // 2024

// 获取下个季度
$nextQuarter = Time::nextQuarter(time()); // 2025-Q4

// 获取上个季度
$prevQuarter = Time::prevQuarter(time()); // 2025-Q2

消息体使用示例

对象调用

use Kode\Message\Message;

$msg = new Message();
$result = $msg->code(200)
              ->msg('操作成功')
              ->data(['id' => 123, 'name' => '测试'])
              ->total(200)
              ->time('2027-10-22 10:10:10')
              ->result();

静态调用

use Kode\Message\Message;

$result = Message::code(302)
                 ->msg('错啦')
                 ->total(200)
                 ->time('2027-10-22 10:10:10')
                 ->result();

JSON输出

$json = Message::code(200)->msg('操作成功')->json();

字段转换配置

// 设置全局字段转换
Message::setGlobalFieldTransform([
    'code' => 'codes',
    'msg' => 'message',
    'data' => 'result'
]);

// 输出结果将包含 codes/message/result 字段
$result = Message::code(200)->msg('操作成功')->result();

自定义状态码

动态添加

$msg = new Message();
$msg->addCode(800000, '自定义业务异常')
    ->addCode(900000, '权限不足');

从文件加载

// 自定义状态码文件 custom_codes.php
return [
    800000 => '自定义业务异常',
    900000 => '权限不足'
];

// 加载自定义状态码文件
$msg = new Message(customCodeFile: 'custom_codes.php');

// 或者动态设置
$msg->setCustomCodeFile('custom_codes.php');

// 重新加载文件
$msg->reloadCustomCodeFile();

加解密模块使用示例

加解密模块提供了三种加密引擎(Sodium、OpenSSL、自动选择)和三种加密模式(标准、URL安全、紧凑),支持AES-256-GCM高级加密标准。

Crypto::加密引擎说明

use Kode\Crypto\Crypto;

// Sodium引擎 - 推荐使用(性能更高,安全性更强)
// 需要PHP扩展:sodium
$crypto = new Crypto('your_key', Crypto::ENGINE_SODIUM);

// OpenSSL引擎 - 通用选择
// 需要PHP扩展:openssl
$crypto = new Crypto('your_key', Crypto::ENGINE_OPENSSL);

// 自动选择引擎 - 自动选择最优引擎
$crypto = new Crypto('your_key', Crypto::ENGINE_AUTO);

Crypto::加密模式说明

use Kode\Crypto\Crypto;

// 标准模式 - Base64编码
$crypto = new Crypto('your_key', Crypto::ENGINE_AUTO, Crypto::MODE_STANDARD);
$encrypted = $crypto->encrypt('敏感数据');
// 输出示例: VEhJUz1mYWxzZVZlcnNpb249MS4wJmtleT1zZWN1cmVfazEyMw==

// URL安全模式 - Base64URL编码(无=号,适合URL传输)
$crypto = new Crypto('your_key', Crypto::ENGINE_AUTO, Crypto::MODE_URL_SAFE);
$encrypted = $crypto->encrypt('敏感数据');
// 输出示例: VEhJUz1mYWxzZVZlcnNpb249MS4wJmtleT1zZWN1cmVfazEyMw

// 紧凑模式 - 十六进制编码(最短长度,适合存储)
$crypto = new Crypto('your_key', Crypto::ENGINE_AUTO, Crypto::MODE_COMPACT);
$encrypted = $crypto->encrypt('敏感数据');
// 输出示例: 54484349533b66756c73652076657273696f6e20312e302e303b6b65793d7365637572655f6b313233

Crypto::基础加解密

use Kode\Crypto\Crypto;

// 创建加密实例
$crypto = new Crypto('your_secret_key_2025');

// 加密数据
$encrypted = $crypto->encrypt('这是需要加密的敏感数据');
echo $encrypted;
// 输出示例: VEhJUz1mYWxzZVZlcnNpb249MS4wJmtleT1zZWN1cmVfazEyMw==

// 解密数据
$decrypted = $crypto->decrypt($encrypted);
echo $decrypted;
// 输出: 这是需要加密的敏感数据

// 使用不同的密钥
$crypto2 = new Crypto('another_key');
$encrypted2 = $crypto2->encrypt('另一个敏感数据');

// 解密(需要使用相同的密钥)
$decrypted2 = $crypto2->decrypt($encrypted2);

Crypto::静态方法调用

use Kode\Crypto\Crypto;

// 静态加密(使用默认密钥)
$encrypted = Crypto::encrypt('敏感数据');
$decrypted = Crypto::decrypt($encrypted);

// 使用自定义密钥的静态方法
$encrypted = (new Crypto('custom_key'))->encrypt('敏感数据');
$decrypted = (new Crypto('custom_key'))->decrypt($encrypted);

Crypto::密码哈希与验证

use Kode\Crypto\Crypto;

// 生成密码哈希
$password = 'my_secure_password';
$hash = Crypto::passwordHash($password);
echo $hash;
// 输出示例: $2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi

// 验证密码
$isValid = Crypto::passwordVerify('my_secure_password', $hash);
echo $isValid ? '密码正确' : '密码错误'; // 密码正确

$isValid = Crypto::passwordVerify('wrong_password', $hash);
echo $isValid ? '密码正确' : '密码错误'; // 密码错误

// 密码哈希更新(重新哈希)
if (password_needs_rehash($hash, PASSWORD_DEFAULT)) {
    $newHash = Crypto::passwordHash($password);
}

Crypto::MD5加密(支持加盐)

use Kode\Crypto\Crypto;

// 基础MD5加密
$md5 = Crypto::md5('123456');
echo $md5;
// 输出: e10adc3949ba59abbe56e057f20f883e

// 加盐MD5加密
$salt = 'your_custom_salt';
$md5WithSalt = Crypto::md5('123456', $salt);
echo $md5WithSalt;
// 输出: 52c69e3a57331081823331c4e6999d23

// 多次加盐(提高安全性)
$doubleSalt = Crypto::md5(Crypto::md5('123456'), $salt);

Crypto::HMAC签名

use Kode\Crypto\Crypto;

// SHA256签名(默认)
$signature = Crypto::hmac('待签名数据', 'your_secret_key');
echo $signature;
// 输出示例: 3a6eb0790f39ac87c94f3856b2dd2c5d110e0f9b0e9c9d6e7b8c9d0e1f2a3b4c

// SHA512签名
$signature512 = Crypto::hmac('待签名数据', 'your_secret_key', 'sha512');
echo $signature512;
// 输出示例: a4e6b8c0d1e2f3a4b5c6d7e8f9a0b1c2d3e4f5a6b7c8d9e0f1a2b3c4d5e6f7a8b9c0d1e2f3a4b5c6d7e8f9a0b1c2

// MD5签名
$signatureMd5 = Crypto::hmac('待签名数据', 'your_secret_key', 'md5');
echo $signatureMd5;
// 输出示例: 1a1dc06f7a0b2c8d9e0f1a2b3c4d5e6f7

// 数据完整性验证
$originalData = '订单数据';
$originalSignature = Crypto::hmac($originalData, 'api_secret');

$receivedData = '订单数据';
$receivedSignature = $_SERVER['HTTP_SIGNATURE'] ?? '';

if (hash_equals($originalSignature, $receivedSignature)) {
    echo '数据完整性验证通过';
} else {
    echo '数据可能被篡改';
}

Crypto::SSL对称加解密

use Kode\Crypto\Crypto;

// 使用自定义密钥进行SSL加密
$key = 'your_ssl_key_32_bytes_long!';
$crypto = new Crypto();

$encrypted = $crypto->sslEncrypt('SSL加密数据', $key);
echo $encrypted;
// 输出示例: VGhpc0lzU1NMY0VuY3J5cHRlZERhdGE=

$decrypted = $crypto->sslDecrypt($encrypted, $key);
echo $decrypted;
// 输出: SSL加密数据

Crypto::错误处理

use Kode\Crypto\Crypto;

$crypto = new Crypto('your_key');

try {
    $encrypted = $crypto->encrypt('敏感数据');
    $decrypted = $crypto->decrypt($encrypted);
    echo '加解密成功: ' . $decrypted;
} catch (\Exception $e) {
    echo '加解密失败: ' . $e->getMessage();
}

// 密钥错误时的解密异常
try {
    $wrongCrypto = new Crypto('wrong_key');
    $decrypted = $wrongCrypto->decrypt($encrypted);
} catch (\Exception $e) {
    echo '解密失败(密钥错误): ' . $e->getMessage();
}

Crypto::使用场景示例

use Kode\Crypto\Crypto;

// 场景1:用户敏感信息加密存储
function saveUserSensitiveData(Crypto $crypto, array $data): array
{
    return [
        'id' => $data['id'],
        'name' => $data['name'],
        'encrypted_phone' => $crypto->encrypt($data['phone']),
        'encrypted_id_card' => $crypto->encrypt($data['id_card'])
    ];
}

function getUserSensitiveData(Crypto $crypto, array $userData): array
{
    return [
        'id' => $userData['id'],
        'name' => $userData['name'],
        'phone' => $crypto->decrypt($userData['encrypted_phone']),
        'id_card' => $crypto->decrypt($userData['encrypted_id_card'])
    ];
}

// 场景2:API请求签名验证
function verifyApiRequest(Crypto $crypto, array $params, string $signature): bool
{
    $expectedSignature = Crypto::hmac(json_encode($params), $apiSecret);
    return hash_equals($expectedSignature, $signature);
}

// 场景3:密码安全存储
function registerUser(string $password): string
{
    return Crypto::passwordHash($password);
}

function verifyUserPassword(string $password, string $hash): bool
{
    return Crypto::passwordVerify($password, $hash);
}

代码生成使用示例

代码生成模块提供了订单号、邀请码、URL安全码、注册码等常用代码的生成功能。

Crypto::订单号生成

use Kode\Crypto\Crypto;

// 生成带前缀的订单号
$orderNo = Crypto::order('ORD');
echo $orderNo;
// 输出示例: ORD202507261234561234

// 生成不带前缀的订单号
$orderNo = Crypto::order('');
echo $orderNo;
// 输出示例: 202507261234561234

// 实际应用场景
function generateOrderNo(string $prefix = 'ORDER'): string
{
    return Crypto::order($prefix);
}

// 使用示例
$orderNo = generateOrderNo('ORD');
// 输出: ORD202507261234561234

$orderNo = generateOrderNo('REFUND');
// 输出: REFUND202507261234561234

Crypto::邀请码生成

use Kode\Crypto\Crypto;

// 生成6位邀请码(默认使用字母+数字)
$inviteCode = Crypto::invite(6);
echo $inviteCode;
// 输出示例: A1B2C3

// 生成8位邀请码
$inviteCode = Crypto::invite(8);
echo $inviteCode;
// 输出示例: A1B2C3D4

// 仅使用字母
$inviteCode = Crypto::invite(6, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ');
echo $inviteCode;
// 输出示例: ABCDEF

// 仅使用数字
$inviteCode = Crypto::invite(6, '0123456789');
echo $inviteCode;
// 输出示例: 123456

// 自定义字符集
$inviteCode = Crypto::invite(8, 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz');
echo $inviteCode;
// 输出示例: AbCdEfGh

// 实际应用场景
function generateInviteCode(int $length = 6): string
{
    return Crypto::invite($length);
}

// 用户注册邀请码
$userInviteCode = generateInviteCode(8);
// 输出: A1B2C3D4

// 活动邀请码(仅大写字母)
$eventInviteCode = Crypto::invite(6, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ');
// 输出: ABC123

Crypto::URL安全码生成

use Kode\Crypto\Crypto;

// 生成16位URL安全码(默认)
$urlCode = Crypto::url();
echo $urlCode;
// 输出示例: abcdefghijklmnop

// 生成32位URL安全码
$urlCode = Crypto::url(32);
echo $urlCode;
// 输出示例: abcdefghijklmnopqrstuvwxyz123456

// 生成64位URL安全码
$urlCode = Crypto::url(64);
echo $urlCode;
// 输出示例: abcdefghijklmnopqrstuvwxyz123456ABCDEFGHIJKLMNOPQRSTUVWXYZabcdef

// 实际应用场景
function generateSecureToken(int $length = 32): string
{
    return Crypto::url($length);
}

// 生成API密钥
$apiKey = generateSecureToken(64);

// 生成密码重置令牌
$resetToken = generateSecureToken(32);

// 生成会话ID
$sessionId = generateSecureToken(16);

Crypto::注册码生成

use Kode\Crypto\Crypto;

// 生成16位注册码,4位分段(默认)
$regCode = Crypto::reg();
echo $regCode;
// 输出示例: ABCD-EFGH-IJKL-MNOP

// 生成12位注册码,4位分段
$regCode = Crypto::reg(12);
echo $regCode;
// 输出示例: ABCD-EFGH-IJKL

// 生成20位注册码,5位分段
$regCode = Crypto::reg(20, 5);
echo $regCode;
// 输出示例: ABCDE-FGHij-KL123-mNOPQ-Rstuv

// 不使用分隔符
$regCode = Crypto::reg(16, 16, '');
echo $regCode;
// 输出示例: ABCDEFGHIJKLMNOP

// 自定义分隔符
$regCode = Crypto::reg(12, 4, '|');
echo $regCode;
// 输出示例: ABCD|EFGH|IJKL

// 实际应用场景
function generateLicenseKey(string $product = 'PRO', int $length = 16): string
{
    return $product . '-' . Crypto::reg($length);
}

// 生成软件许可证密钥
$licenseKey = generateLicenseKey('PRO');
// 输出示例: PRO-ABCD-EFGH-IJKL-MNOP

// 生成激活码
$activationCode = Crypto::reg(12, 4, '-');
// 输出示例: ABCD-EFGH-IJKL

// 生成优惠券码
$couponCode = Crypto::reg(10, 5, '');
// 输出示例: ABCDE12345

随机数生成

use Kode\Crypto\Crypto;

// 生成指定范围的随机整数
$random = Crypto::random(1, 100);
echo $random;
// 输出示例: 42

$random = Crypto::random(1000, 9999);
echo $random;
// 输出示例: 5678

// 生成随机字符串
$randomStr = Crypto::randomStr(16);
echo $randomStr;
// 输出示例: aB3dE7fG9jK2mN6

// 实际应用场景
function generateVerificationCode(): string
{
    return Crypto::random(100000, 999999);
}

// 生成6位数字验证码
$verificationCode = generateVerificationCode();
// 输出示例: 123456

// 生成4位数字PIN码
$pinCode = Crypto::random(1000, 9999);
// 输出示例: 5678

// 生成随机密码
$randomPassword = Crypto::randomStr(12);
// 输出示例: xK9mP2vL5nR8

数组转路径结构

// 数组转路径结构
$pathList = Arr::path($list);
// 输出示例:
// [
//     ['id' => 1, 'parent_id' => 0, 'name' => '根节点', 'path' => '1'],
//     ['id' => 2, 'parent_id' => 1, 'name' => '子节点1', 'path' => '1,2'],
//     ['id' => 3, 'parent_id' => 1, 'name' => '子节点2', 'path' => '1,3'],
//     ['id' => 4, 'parent_id' => 2, 'name' => '孙节点1', 'path' => '1,2,4']
// ]

高级特性

进程和协程支持

工具包采用线程安全的初始化机制,确保在多进程和协程环境下的稳定运行。

魔术方法扩展

通过魔术方法可以动态设置任意字段:

$result = Message::code(200)
                 ->msg('操作成功')
                 ->total(200)
                 ->page(1)
                 ->size(10)
                 ->traceId('abc123')
                 ->result();

空数据处理

当data字段为空时,不会在结果中显示:

// 结果中不包含data字段
$result = Message::code(200)->msg('操作成功')->result();

// 结果中包含data字段(空数组)
$result = Message::code(200)->msg('操作成功')->data([])->result();

核心API

消息体核心方法

方法名 功能描述 参数说明
code(int $code) 设置状态码 $code: 状态码
msg(string $msg) 设置消息内容 $msg: 消息文本
data(mixed $data) 设置业务数据 $data: 业务数据
ext(string $key, mixed $value) 添加自定义字段 $key: 字段名, $value: 字段值
setFieldTransform(array $config) 设置字段转换配置 $config: 字段映射数组
setCustomCodeFile(string $filePath) 设置自定义状态码文件 $filePath: 文件路径
reloadCustomCodeFile() 重新加载自定义状态码文件 -
result() 输出结果数组 -
json() 输出JSON字符串 -

加解密核心方法

方法名 功能描述 参数说明
encrypt(string $data) 加密数据 $data: 待加密数据
decrypt(string $data) 解密数据 $data: 待解密数据
setEngine(string $engine) 设置加密引擎 $engine: 加密引擎(auto/sodium/openssl)
setMode(string $mode) 设置加密模式 $mode: 加密模式(standard/url_safe/compact)

代码生成核心方法

方法名 功能描述 参数说明
order(string $prefix = '') 生成订单号 $prefix: 前缀
invite(int $length = 6, string $chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789') 生成邀请码 $length: 长度, $chars: 字符集
url(int $length = 16) 生成URL安全码 $length: 长度
reg(int $length = 16, int $segmentLength = 4, string $separator = '-') 生成注册码 $length: 长度, $segmentLength: 分段长度, $separator: 分隔符

树形结构处理方法

方法名 功能描述 参数说明
tree(array $array, string $idKey, string $pidKey, string $childrenKey) 数组转树形结构 $array: 扁平数组, $idKey: ID键名, $pidKey: 父ID键名, $childrenKey: 子节点键名
list(array $tree, string $childrenKey) 树形结构转数组 $tree: 树形数组, $childrenKey: 子节点键名
level(array $array, string $idKey, string $pidKey, string $levelKey) 数组转层级结构 $array: 扁平数组, $idKey: ID键名, $pidKey: 父ID键名, $levelKey: 层级键名
path(array $array, string $idKey, string $pidKey, string $nameKey, string $pathKey, string $separator) 数组转路径结构 $array: 扁平数组, $idKey: ID键名, $pidKey: 父ID键名, $nameKey: 名称键名, $pathKey: 路径键名, $separator: 分隔符

数组处理核心方法

方法名 功能描述 参数说明
first(array $array) 获取数组第一个元素 $array: 数组
last(array $array) 获取数组最后一个元素 $array: 数组
find(array $array, callable $callback) 查找满足条件的元素 $array: 数组, $callback: 回调函数
findKey(array $array, callable $callback) 查找满足条件的键名 $array: 数组, $callback: 回调函数
any(array $array, callable $callback) 检查是否存在满足条件的元素 $array: 数组, $callback: 回调函数
all(array $array, callable $callback) 检查是否所有元素都满足条件 $array: 数组, $callback: 回调函数
`get(array $array, string array $key, mixed $default)` 获取数组值(支持点语法)
`set(array $array, string array $key, mixed $value)` 设置数组值
`has(array $array, string array $key)` 判断是否存在键
only(array $array, array $keys) 仅保留指定键 $array: 数组, $keys: 键名数组
except(array $array, array $keys) 排除指定键 $array: 数组, $keys: 键名数组
deepMerge(array ...$arrays) 数组深度合并 $arrays: 多个数组
group(array $array, string $key) 多维数组分组 $array: 数组, $key: 分组键名
count(array $array, string $key) 多维数组统计 $array: 数组, $key: 统计键名
sum(array $array, string $key) 多维数组求和 $array: 数组, $key: 求和键名
avg(array $array, string $key) 多维数组求平均值 $array: 数组, $key: 平均键名
max(array $array, string $key) 多维数组求最大值 $array: 数组, $key: 最大值键名
min(array $array, string $key) 多维数组求最小值 $array: 数组, $key: 最小值键名

字符串处理核心方法

方法名 功能描述 参数说明
mask(string $str, int $start, int $length, string $mask) 字符串脱敏 $str: 字符串, $start: 开始位置, $length: 长度, $mask: 掩码字符
maskPhone(string $phone, int $start, int $length) 手机号脱敏 $phone: 手机号, $start: 开始位置, $length: 长度
maskEmail(string $email, int $start, int $length) 邮箱脱敏 $email: 邮箱, $start: 开始位置, $length: 长度
maskIdCard(string $idCard, int $start, int $length) 身份证号脱敏 $idCard: 身份证号, $start: 开始位置, $length: 长度
maskBankCard(string $bankCard, int $start, int $length) 银行卡号脱敏 $bankCard: 银行卡号, $start: 开始位置, $length: 长度
maskName(string $name, int $start, int $length) 姓名脱敏 $name: 姓名, $start: 开始位置, $length: 长度
length(string $str) 字符串长度 $str: 字符串
truncate(string $str, int $length, string $suffix) 字符串截断 $str: 字符串, $length: 截断长度, $suffix: 后缀
limit(string $str, int $length, string $suffix) 字符串限制长度 $str: 字符串, $length: 限制长度, $suffix: 后缀
snake(string $str) 驼峰转下划线 $str: 字符串
camel(string $str) 下划线转驼峰 $str: 字符串
pascal(string $str) 下划线转大驼峰 $str: 字符串
kebab(string $str) 驼峰转短横线 $str: 字符串
random(int $length) 生成随机字符串 $length: 长度
uuid() 生成UUID -
contains(string $str, string $needle) 是否包含子串 $str: 字符串, $needle: 子串
startsWith(string $str, string $needle) 是否以子串开头 $str: 字符串, $needle: 子串
endsWith(string $str, string $needle) 是否以子串结尾 $str: 字符串, $needle: 子串
toBase64(string $str) 转Base64编码 $str: 字符串
fromBase64(string $str) Base64解码 $str: Base64字符串
toJson(mixed $data) 转JSON $data: 数据
fromJson(string $json) JSON解码 $json: JSON字符串
toXml(array $data, string $root) 转XML $data: 数据, $root: 根节点名
fromXml(string $xml) XML解码 $xml: XML字符串
toArray(string $str, string $delimiter) 转数组 $str: 字符串, $delimiter: 分隔符
fromArray(array $array, string $delimiter) 数组转字符串 $array: 数组, $delimiter: 分隔符

数学计算模块使用示例

数学计算模块提供了高精度数学计算、金融计算、统计分析等功能,使用BCMath扩展解决浮点数精度丢失问题。

Math::基础运算

use Kode\Math\Math;

// 加法运算
$result = Math::add('1.1', '2.2'); // 3.3
$result = Math::add('1.1', '2.2', 4); // 3.3000(保留4位小数)

// 减法运算
$result = Math::sub('5.5', '2.2'); // 3.3
$result = Math::sub('5.5', '2.2', 4); // 3.3000(保留4位小数)

// 乘法运算
$result = Math::mul('1.5', '2'); // 3
$result = Math::mul('1.5', '2', 4); // 3.0000(保留4位小数)

// 除法运算
$result = Math::div('10', '3'); // 3.3333333333
$result = Math::div('10', '3', 2); // 3.33(保留2位小数)

// 取模运算
$result = Math::mod('10', '3'); // 1

// 幂运算
$result = Math::pow('2', '10'); // 1024
$result = Math::pow('2', '10', 4); // 1024.0000(保留4位小数)

// 平方根运算
$result = Math::sqrt('16'); // 4
$result = Math::sqrt('2', 10); // 1.4142135624(保留10位小数)

Math::数值处理

use Kode\Math\Math;

// 四舍五入
$result = Math::round('3.14159', 2); // 3.14
$result = Math::round('3.14159', 4); // 3.1416

// 向上取整
$result = Math::ceil('3.2'); // 4
$result = Math::ceil('3.8'); // 4
$result = Math::ceil('3.14159', 2); // 3.15(保留2位小数后向上取整)

// 向下取整
$result = Math::floor('3.2'); // 3
$result = Math::floor('3.8'); // 3
$result = Math::floor('3.14159', 2); // 3.14(保留2位小数后向下取整)

// 绝对值
$result = Math::abs('-5'); // 5
$result = Math::abs('5'); // 5

// 数值比较
$result = Math::compare('5', '3'); // 1(5 > 3)
$result = Math::compare('3', '5'); // -1(3 < 5)
$result = Math::compare('5', '5'); // 0(5 == 5)

// 判断是否相等
$result = Math::equal('1.1', '1.10', 2); // true(保留2位小数比较)
$result = Math::equal('1.1', '1.10', 10); // false(保留10位小数比较)

// 格式化数字
$result = Math::format('1234.5678', 2); // 1,234.57(千分位分隔符)
$result = Math::format('1234.5678', 2, false); // 1234.57(无千分位分隔符)

Math::三角函数

use Kode\Math\Math;

// 正弦函数
$result = Math::sin(deg2rad(30)); // 0.5(30度的正弦值)
$result = Math::sin(deg2rad(30), 10); // 0.5000000000(保留10位小数)

// 余弦函数
$result = Math::cos(deg2rad(60)); // 0.5(60度的余弦值)
$result = Math::cos(deg2rad(60), 10); // 0.5000000000(保留10位小数)

// 正切函数
$result = Math::tan(deg2rad(45)); // 1(45度的正切值)
$result = Math::tan(deg2rad(45), 10); // 1.0000000000(保留10位小数)

// 反正弦函数
$result = Math::asin(0.5); // 0.5235987756(弧度)
$result = Math::asin(0.5, 10); // 0.5235987756(保留10位小数)

// 反余弦函数
$result = Math::acos(0.5); // 1.0471975512(弧度)
$result = Math::acos(0.5, 10); // 1.0471975512(保留10位小数)

// 反正切函数
$result = Math::atan(1); // 0.7853981634(弧度)
$result = Math::atan(1, 10); // 0.7853981634(保留10位小数)

// 弧度转角度
$result = Math::rad2deg(deg2rad(90)); // 90(弧度转角度)
$result = Math::rad2deg(deg2rad(90), 10); // 90.0000000000(保留10位小数)

// 角度转弧度
$result = Math::deg2rad(90); // 1.5707963268(角度转弧度)
$result = Math::deg2rad(90, 10); // 1.5707963268(保留10位小数)

Math::对数函数

use Kode\Math\Math;

// 自然对数
$result = Math::ln('10'); // 2.3025850930
$result = Math::ln('10', 10); // 2.3025850930(保留10位小数)

// 常用对数
$result = Math::log10('100'); // 2
$result = Math::log10('100', 10); // 2.0000000000(保留10位小数)

// 自定义底数对数
$result = Math::log('8', '2'); // 3(以2为底8的对数)
$result = Math::log('8', '2', 10); // 3.0000000000(保留10位小数)

Math::数论函数

use Kode\Math\Math;

// 阶乘
$result = Math::factorial(5); // 120(5! = 5×4×3×2×1)
$result = Math::factorial(0); // 1(0! = 1)

// 最大公约数
$result = Math::gcd(12, 18); // 6(12和18的最大公约数)
$result = Math::gcd(24, 36); // 12(24和36的最大公约数)

// 最小公倍数
$result = Math::lcm(12, 18); // 36(12和18的最小公倍数)
$result = Math::lcm(24, 36); // 72(24和36的最小公倍数)

Math::金融计算

use Kode\Math\Math;

// 百分比计算
$result = Math::percentage('25', '100'); // 25(25占100的百分比)
$result = Math::percentage('25', '100', 4); // 25.0000(保留4位小数)

// 折扣计算
$result = Math::discount('100', '0.8'); // 80(100元打8折)
$result = Math::discount('100', '0.8', 4); // 80.0000(保留4位小数)

// 税费计算
$result = Math::tax('100', '0.13'); // 13(100元的13%税费)
$result = Math::tax('100', '0.13', 4); // 13.0000(保留4位小数)

// 含税金额计算
$result = Math::taxIncluded('100', '0.13'); // 113(不含税100元,税率13%,含税113元)
$result = Math::taxIncluded('100', '0.13', 4); // 113.0000(保留4位小数)

// 不含税金额计算
$result = Math::taxExcluded('113', '0.13'); // 100(含税113元,税率13%,不含税100元)
$result = Math::taxExcluded('113', '0.13', 4); // 100.0000(保留4位小数)

// 简单利息计算
$result = Math::simpleInterest('10000', '0.05', 2); // 1000(本金10000元,年利率5%,2年利息)
$result = Math::simpleInterest('10000', '0.05', 2, 4); // 1000.0000(保留4位小数)

// 复利计算
$result = Math::compoundInterest('10000', '0.05', 2); // 11025(本金10000元,年利率5%,2年本息合计)
$result = Math::compoundInterest('10000', '0.05', 2, 4); // 11025.0000(保留4位小数)

Math::统计分析

use Kode\Math\Math;

// 平均值计算
$result = Math::average([1, 2, 3, 4, 5]); // 3
$result = Math::average([1, 2, 3, 4, 5], 4); // 3.0000(保留4位小数)

// 中位数计算
$result = Math::median([1, 2, 3, 4, 5]); // 3(奇数个元素取中间值)
$result = Math::median([1, 2, 3, 4]); // 2.5(偶数个元素取中间两个的平均值)
$result = Math::median([1, 2, 3, 4], 4); // 2.5000(保留4位小数)

// 众数计算
$result = Math::mode([1, 2, 2, 3, 3, 3, 4]); // 3(出现次数最多的值)

// 标准差计算
$result = Math::standardDeviation([1, 2, 3, 4, 5]); // 1.5811388301
$result = Math::standardDeviation([1, 2, 3, 4, 5], 4); // 1.5811(保留4位小数)

// 方差计算
$result = Math::variance([1, 2, 3, 4, 5]); // 2.5(标准差的平方)
$result = Math::variance([1, 2, 3, 4, 5], 4); // 2.5000(保留4位小数)

Math::数值判断

use Kode\Math\Math;

// 判断是否为正数
$result = Math::isPositive('5'); // true
$result = Math::isPositive('-5'); // false
$result = Math::isPositive('0'); // false

// 判断是否为负数
$result = Math::isNegative('-5'); // true
$result = Math::isNegative('5'); // false
$result = Math::isNegative('0'); // false

// 判断是否为零
$result = Math::isZero('0'); // true
$result = Math::isZero('0.0000000001', 10); // true(保留10位小数比较)
$result = Math::isZero('0.0000000001', 11); // false(保留11位小数比较)

// 判断是否为偶数
$result = Math::isEven(4); // true
$result = Math::isEven(5); // false

// 判断是否为奇数
$result = Math::isOdd(5); // true
$result = Math::isOdd(4); // false

// 判断是否为质数
$result = Math::isPrime(7); // true
$result = Math::isPrime(8); // false
$result = Math::isPrime(2); // true
$result = Math::isPrime(1); // false

// 判断数值是否有效
$result = Math::isValid('123'); // true
$result = Math::isValid('abc'); // false
$result = Math::isValid(INF); // false(无穷大)
$result = Math::isValid(NAN); // false(非数字)

Math::数值范围和随机数

use Kode\Math\Math;

// 数值范围检查
$result = Math::inRange('5', '1', '10'); // true(5在1到10之间)
$result = Math::inRange('0', '1', '10'); // false(0不在1到10之间)
$result = Math::inRange('11', '1', '10'); // false(11不在1到10之间)

// 限制数值范围
$result = Math::clamp('5', '1', '10'); // 5(5在范围内,保持不变)
$result = Math::clamp('0', '1', '10'); // 1(0小于最小值,返回最小值)
$result = Math::clamp('11', '1', '10'); // 10(11大于最大值,返回最大值)

// 生成随机数
$result = Math::random(1, 100); // 1到100之间的随机整数
$result = Math::random(1, 100, 2); // 1到100之间的随机浮点数,保留2位小数

// 线性插值
$result = Math::lerp(0, 100, 0.5); // 50(在0和100之间插值,因子为0.5)
$result = Math::lerp(0, 100, 0.25); // 25(在0和100之间插值,因子为0.25)
$result = Math::lerp(0, 100, 0.75); // 75(在0和100之间插值,因子为0.75)

地理位置模块使用示例

地理位置模块提供了坐标之间的距离计算、坐标验证、中点计算、方位角计算等功能,使用Haversine公式进行精确计算。

Geo::距离计算

use Kode\Geo\Geo;

// 计算两点之间的距离(单位:公里)
$distance = Geo::distance(39.9042, 116.4074, 31.2304, 121.4737); // 1067.7(北京到上海的距离)

// 计算两点之间的距离(单位:英里)
$distance = Geo::distance(39.9042, 116.4074, 31.2304, 121.4737, 'mi'); // 663.4(北京到上海的距离)

// 计算两点之间的距离(单位:米)
$distance = Geo::distance(39.9042, 116.4074, 31.2304, 121.4737, 'm'); // 1067700(北京到上海的距离)

Geo::坐标验证

use Kode\Geo\Geo;

// 验证坐标是否有效
$isValid = Geo::isValid(39.9042, 116.4074); // true(北京坐标有效)
$isValid = Geo::isValid(91, 116.4074); // false(纬度超出范围[-90, 90])
$isValid = Geo::isValid(39.9042, 181); // false(经度超出范围[-180, 180])

Geo::中点计算

use Kode\Geo\Geo;

// 计算两个坐标之间的中点
$midpoint = Geo::midpoint(39.9042, 116.4074, 31.2304, 121.4737);
// 输出: [35.5673, 118.9406](北京和上海的中点坐标)

Geo::方位角计算

use Kode\Geo\Geo;

// 计算两个坐标之间的方位角
$bearing = Geo::bearing(39.9042, 116.4074, 31.2304, 121.4737); // 137.5(从北京到上海的方位角)

Geo::坐标转换

use Kode\Geo\Geo;

// 十进制度数转度分秒(DMS)
$dms = Geo::toDMS(39.9042, true); // [39, 54, 15.12, 'N'](39.9042° = 39°54'15.12"N)
$dms = Geo::toDMS(116.4074, false); // [116, 24, 26.64, 'E'](116.4074° = 116°24'26.64"E)

// 度分秒(DMS)转十进制度数
$decimal = Geo::toDecimal(39, 54, 15.12, 'N'); // 39.9042
$decimal = Geo::toDecimal(116, 24, 26.64, 'E'); // 116.4074
$decimal = Geo::toDecimal(39, 54, 15.12, 'S'); // -39.9042(南纬为负)
$decimal = Geo::toDecimal(116, 24, 26.64, 'W'); // -116.4074(西经为负)

Geo::角度转换

use Kode\Geo\Geo;

// 角度转弧度
$radians = Geo::toRadians(90); // 1.5707963268(90度转弧度)

// 弧度转角度
$degrees = Geo::toDegrees(1.5707963268); // 90(1.5707963268弧度转角度)

IP地址处理模块使用示例

IP地址处理模块提供了IP地址获取、验证、私有IP检测等功能,支持代理头获取真实IP。

Ip::获取客户端IP

use Kode\Ip\Ip;

// 获取客户端IP
$ip = Ip::get(); // 192.168.1.1(客户端IP地址)

// 获取客户端IP(支持代理头)
$ip = Ip::get(true); // 8.8.8.8(从代理头获取真实IP)

Ip::IP地址验证

use Kode\Ip\Ip;

// 验证IP地址是否有效
$isValid = Ip::isValid('192.168.1.1'); // true
$isValid = Ip::isValid('8.8.8.8'); // true
$isValid = Ip::isValid('256.256.256.256'); // false(IP地址无效)
$isValid = Ip::isValid('abc'); // false(IP地址无效)

Ip::私有IP检测

use Kode\Ip\Ip;

// 判断是否为私有IP
$isPrivate = Ip::isPrivate('192.168.1.1'); // true(私有IP)
$isPrivate = Ip::isPrivate('10.0.0.1'); // true(私有IP)
$isPrivate = Ip::isPrivate('172.16.0.1'); // true(私有IP)
$isPrivate = Ip::isPrivate('8.8.8.8'); // false(公网IP)

// 判断是否为公网IP
$isPublic = Ip::isPublic('8.8.8.8'); // true(公网IP)
$isPublic = Ip::isPublic('192.168.1.1'); // false(私有IP)

Ip::IP地址类型判断

use Kode\Ip\Ip;

// 判断IP地址类型
$type = Ip::getType('192.168.1.1'); // 'private'(私有IP)
$type = Ip::getType('8.8.8.8'); // 'public'(公网IP)
$type = Ip::getType('127.0.0.1'); // 'loopback'(回环地址)
$type = Ip::getType('256.256.256.256'); // 'invalid'(无效IP)

Ip::IP地址格式化

use Kode\Ip\Ip;

// 格式化IP地址
$formatted = Ip::format('192.168.1.1'); // '192.168.1.1'
$formatted = Ip::format('192.168.1.1', true); // '192.168.001.001'(补零格式化)

状态码列表

基础状态码

状态码 描述
200 success
400 bad request
401 unauthorized
403 forbidden
404 not found
500 internal server error

业务状态码

状态码 描述
300000 token invalid
300001 token expired
400000 parameter error
500000 database error
600000 business logic error

版本要求

  • PHP >= 8.1
  • ext-openssl
  • ext-json

许可证

MIT License

统计信息

  • 总下载量: 3
  • 月度下载量: 0
  • 日度下载量: 0
  • 收藏数: 0
  • 点击次数: 1
  • 依赖项目数: 0
  • 推荐数: 0

GitHub 信息

  • Stars: 0
  • Watchers: 0
  • Forks: 0
  • 开发语言: PHP

其他信息

  • 授权协议: MIT
  • 更新时间: 2025-12-26