PHPackages                             kode/tools - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [HTTP &amp; Networking](/categories/http)
4. /
5. kode/tools

ActiveLibrary[HTTP &amp; Networking](/categories/http)

kode/tools
==========

PHP8.1+通用工具包，包含消息体、数组处理、字符串处理、时间处理、加解密、IP、地理计算、Curl、二维码、全局辅助函数等

v1.8.2(3mo ago)143[1 issues](https://github.com/kodephp/tools/issues)1MITPHPPHP &gt;=8.1

Since Dec 25Pushed 3mo agoCompare

[ Source](https://github.com/kodephp/tools)[ Packagist](https://packagist.org/packages/kode/tools)[ Docs](https://github.com/kode/tools)[ GitHub Sponsors](https://github.com/sponsors/kode)[ RSS](/packages/kode-tools/feed)WikiDiscussions master Synced today

READMEChangelogDependencies (3)Versions (19)Used By (1)

kode/tools - PHP8.1+ 通用工具包
==========================

[](#kodetools---php81-通用工具包)

- [简介](#%E7%AE%80%E4%BB%8B)
- [安装](#%E5%AE%89%E8%A3%85)
- [消息体模块](#%E6%B6%88%E6%81%AF%E4%BD%93%E6%A8%A1%E5%9D%97)
- [加解密模块](#%E5%8A%A0%E8%A7%A3%E5%AF%86%E6%A8%A1%E5%9D%97)
- [HTTP请求模块](#http%E8%AF%B7%E6%B1%82%E6%A8%A1%E5%9D%97)
- [数组处理模块](#%E6%95%B0%E7%BB%84%E5%A4%84%E7%90%86%E6%A8%A1%E5%9D%97)
- [字符串处理模块](#%E5%AD%97%E7%AC%A6%E4%B8%B2%E5%A4%84%E7%90%86%E6%A8%A1%E5%9D%97)
- [时间处理模块](#%E6%97%B6%E9%97%B4%E5%A4%84%E7%90%86%E6%A8%A1%E5%9D%97)
- [数学计算模块](#%E6%95%B0%E5%AD%A6%E8%AE%A1%E7%AE%97%E6%A8%A1%E5%9D%97)
- [地理位置模块](#%E5%9C%B0%E7%90%86%E4%BD%8D%E7%BD%AE%E6%A8%A1%E5%9D%97)
- [IP地址模块](#ip%E5%9C%B0%E5%9D%80%E6%A8%A1%E5%9D%97)
- [二维码模块](#%E4%BA%8C%E7%BB%B4%E7%A0%81%E6%A8%A1%E5%9D%97)
- [全局辅助函数](#%E5%85%A8%E5%B1%80%E8%BE%85%E5%8A%A9%E5%87%BD%E6%95%B0)
- [许可证](#%E8%AE%B8%E5%8F%AF%E8%AF%81)

简介
--

[](#简介)

这是一个基于PHP8.1+特性开发的模块化通用工具包，提供了消息体、数组处理、字符串处理、时间处理、加解密、IP地址处理、地理计算、HTTP请求、二维码生成、全局辅助方法等功能。支持对象和静态两种调用方式。

安装
--

[](#安装)

```
composer require kode/tools
```

消息体模块
-----

[](#消息体模块)

### 特性

[](#特性)

- ✅ 灵活的链式调用（code/data/msg等方法可任意顺序调用）
- ✅ 默认200状态码，默认消息"成功"
- ✅ 支持动态添加任意字段（page/name/total等）
- ✅ 内置状态码映射（HTTP标准码+业务码）
- ✅ 支持自定义状态码映射
- ✅ XSS防护（可选）
- ✅ 危险方法名防护

### 快速开始

[](#快速开始)

```
use Kode\Message\Message;

// 默认200，msg="成功"
Message::result();
// 结果: ['code' => 200, 'msg' => '成功']

// 指定状态码和消息
Message::code(20001)->msg('请求数据有误')->result();
// 结果: ['code' => 20001, 'msg' => '请求数据有误']

// 传入data数据（无data不显示data字段）
Message::data(['id' => 1])->result();
// 结果: ['code' => 200, 'msg' => '成功', 'data' => ['id' => 1]]

// 链式调用位置不约束
Message::data(['id' => 1])->code(20001)->msg('请求数据有误')->result();
// 结果: ['code' => 20001, 'msg' => '请求数据有误', 'data' => ['id' => 1]]

// 动态添加任意字段
Message::data(['id' => 1])->page(1)->name('张三')->result();
// 结果: ['code' => 200, 'msg' => '成功', 'data' => ['id' => 1], 'page' => 1, 'name' => '张三']
```

### 方法说明

[](#方法说明)

方法说明示例`Message::result()`返回结果数组，默认code=200, msg="成功"`Message::result()``Message::code(int $code)`设置状态码`Message::code(400)``Message::msg(string $msg)`设置消息文本`Message::msg('成功')``Message::data(mixed $data)`设置数据（可选）`Message::data(['id' => 1])``Message::page(int $page)`设置页码（动态字段）`Message::page(1)``Message::total(int $total)`设置总数（动态字段）`Message::total(100)``Message::loadCodes(string $path)`从文件加载状态码`Message::loadCodes('config/codes.php')``Message::codes(array $codes)`合并自定义状态码`Message::codes([800000 => '自定义错误'])`### 内置状态码

[](#内置状态码)

```
// HTTP标准码
200 => 'OK', 400 => 'Bad Request', 401 => 'Unauthorized',
403 => 'Forbidden', 404 => 'Not Found', 500 => 'Internal Server Error'

// 业务码
300000 => 'Token无效', 300001 => 'Token已过期',
400000 => '参数错误', 500000 => '数据库错误'
```

加解密模块
-----

[](#加解密模块)

### 特性

[](#特性-1)

- ✅ AES-256-GCM加密
- ✅ Sodium和OpenSSL双引擎自动切换
- ✅ MD5/SHA系列哈希（支持加盐）
- ✅ 密码哈希和验证
- ✅ HMAC签名
- ✅ UUID/Token/邀请码/验证码生成

### 快速开始

[](#快速开始-1)

```
use Kode\Crypto\Crypto;

// AES加密解密（密钥至少16字符）
$crypto = new Crypto('mykey1234567890ab');  // 17字符密钥
$encrypted = $crypto->encrypt('敏感数据');
// 加密结果: JeB6LDA+LM9Yu87injOYd0ToSPfb4f/XBcEv7/qI6TWDczdBd3...

$decrypted = $crypto->decrypt($encrypted);
// 解密结果: 敏感数据

// 特殊字符/中文/emoji完全支持
$crypto->encrypt('你好世界 🌍');
// 加密结果: DKJaDjUoVt8mHZHlNba/XKk1pRY9dYV23kR2FTPkhnq69Er2OP...

// MD5哈希（加盐）
Crypto::md5('123456', 'salt');
// 结果: 2e4475e67a7d80f8c1e5c3f5e5c3a8f5

// 密码哈希
$hash = Crypto::passwordHash('123456');
// 结果: $2y$10$LQv3c1yqBwe...（随机哈希）
Crypto::passwordVerify('123456', $hash);
// 结果: true

// UUID/Token生成
Crypto::uuid();
// 结果: 58d1b3c9-5ec4-4356-8007-e7ec469d1dae
Crypto::token(32);
// 结果: 89eb2398743a88f5fdcf33c727242a3d

// HMAC签名
Crypto::hmac('数据', '密钥', 'sha256');
// 结果: 3d5f8e2b1a9c4d7e6f8a3b2c1d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0c1d2e3f
```

### 特殊字符支持

[](#特殊字符支持)

加解密功能完美支持以下特殊字符：

类型示例支持状态中文`你好世界`✅ 完全支持Emoji`😀🎉🚀`✅ 完全支持特殊符号`!@#$%^&*()_+-=[]{}`✅ 完全支持HTML标签`alert("xss")`✅ 完全支持JSON字符串`{"key":"value"}`✅ 完全支持多行文本`第一行\n第二行\r\n`✅ 完全支持空字符`前端\0后端`✅ 完全支持SQL注入`'; DROP TABLE users; --`✅ 完全支持### 加密引擎

[](#加密引擎)

自动检测并选择最优加密引擎：

引擎算法说明Sodium (推荐)AES-256-GCM优先使用（PHP8.5+）Sodium FallbackChaCha20-Poly1305Sodium不支持AES-GCM时自动切换OpenSSLAES-256-GCMSodium不可用时使用### 输出模式

[](#输出模式)

模式说明适用场景`MODE_STANDARD`标准Base64默认，数据存储`MODE_URL_SAFE`URL安全Base64URL参数传输`MODE_COMPACT`十六进制日志记录、调试### URL传输加解密

[](#url传输加解密)

URL传输时需要使用`MODE_URL_SAFE`模式，避免`+/=`等字符被URL编码：

```
use Kode\Crypto\Crypto;

// 创建URL安全加密实例
$crypto = new Crypto('your_secret_key_16chars');
$crypto->mode(Crypto::MODE_URL_SAFE);

// 加密数据
$original = '{"user_id":123,"token":"jwt..."}';
$encrypted = $crypto->encrypt($original);
// 加密结果: r50Mzv6rf1t5q6AJvQt5Pc-Zqy5ykcrgX8jSEgGi...

// 构建URL
$url = 'https://api.example.com/user?' . http_build_query(['data' => $encrypted]);

// 服务器端解密
$received = $_GET['data'] ?? $encrypted;
$decrypted = $crypto->decrypt($received);
// 解密结果: {"user_id":123,"token":"jwt..."}
```

### 安全防护

[](#安全防护)

#### XSS防护

[](#xss防护)

使用`Str::xssSafe()`防护XSS攻击：

```
use Kode\String\Str;

// XSS攻击示例
$attacks = [
    'alert("XSS")',
    'javascript:alert("XSS")',
    '',
];

// 防护处理
foreach ($attacks as $input) {
    $safe = Str::xssSafe($input);
    echo $safe;
    // 输出: &lt;script&gt;alert(&quot;XSS&quot;)&lt;/script&gt;
}
```

#### SQL注入防护

[](#sql注入防护)

使用`Str::sqlSafe()`防护SQL注入：

```
use Kode\String\Str;

$userInput = "'; DROP TABLE users; --";
$safe = Str::sqlSafe($userInput);
// 输出: \'\'; DROP TABLE users; --

// 严格模式（去除所有非字母数字字符）
$strict = Str::sqlSafe($userInput, true);
// 输出: DROPTABLEUSERS
```

#### HTML转义

[](#html转义)

使用`Str::htmlEscape()`转义HTML特殊字符：

```
use Kode\String\Str;

$html = 'Hello & "World"';
$escaped = Str::htmlEscape($html);
// 输出: &lt;div class=&quot;test&quot;&gt;Hello &amp; &quot;World&quot;&lt;/div&gt;
```

### 方法说明

[](#方法说明-1)

方法说明示例`Crypto::md5(string $str, string $salt)`MD5哈希（可选加盐）`Crypto::md5('123', 'salt')``Crypto::sha1(string $str, string $salt)`SHA1哈希（可选加盐）`Crypto::sha1('123', 'salt')``Crypto::sha256(string $str, string $salt)`SHA256哈希（可选加盐）`Crypto::sha256('123', 'salt')``Crypto::hash(string $data, string $algo)`通用哈希`Crypto::hash('data', 'sha512')``Crypto::passwordHash(string $str)`密码哈希`Crypto::passwordHash('123')``Crypto::passwordVerify(string $str, string $hash)`密码验证`Crypto::passwordVerify('123', $hash)``Crypto::hmac(string $data, string $key, string $algo)`HMAC签名`Crypto::hmac('data', 'key')``Crypto::hashEquals(string $known, string $user)`恒时比较`Crypto::hashEquals($a, $b)``Crypto::token(int $length)`生成随机Token`Crypto::token(32)``Crypto::uuid()`生成UUID`Crypto::uuid()``Crypto::randomString(int $length)`随机字符串`Crypto::randomString(16)``Crypto::orderId(string $prefix)`订单号`Crypto::orderId('ORD')``Crypto::inviteCode(int $length)`邀请码`Crypto::inviteCode(6)``Crypto::verifyCode(int $length)`验证码`Crypto::verifyCode(4)``(new Crypto($key))->encrypt(string $data)`AES加密`$c->encrypt('data')``(new Crypto($key))->decrypt(string $data)`AES解密`$c->decrypt($encrypted)`HTTP请求模块
--------

[](#http请求模块)

### 特性

[](#特性-2)

- ✅ GET/POST/PUT/PATCH/DELETE/HEAD/OPTIONS
- ✅ 链式调用
- ✅ JSON/表单/文件上传
- ✅ SSL验证和代理支持
- ✅ 重试机制
- ✅ 中间件支持
- ✅ Promise风格then/catch

### 快速开始

[](#快速开始-2)

```
use Kode\Curl\Curl;

// GET请求
$response = Curl::get('https://api.example.com/users', ['page' => 1])
    ->timeout(30)
    ->headers(['Authorization' => 'Bearer xxx'])
    ->send();
// 响应: Response对象，可调用 $response->json() 获取数据

// POST请求
$response = Curl::post('https://api.example.com/users', ['name' => '张三'])
    ->withJson(['name' => '张三'])
    ->send();
// 响应: Response对象

// 链式调用
$response = Curl::create('https://api.example.com/users')
    ->method('POST')
    ->withJson(['name' => '张三'])
    ->authorization('Bearer xxx')
    ->send();
// 响应: Response对象

// Promise风格
$result = Curl::get('https://api.example.com/users')
    ->then(fn($response) => $response->json())
    ->catch(fn($response) => $response->getErrorMessage());
// 成功: 返回JSON数据
// 失败: 返回错误消息
```

### 方法说明

[](#方法说明-2)

方法说明示例`Curl::get(string $url, array $query)`GET请求`Curl::get('/users', ['page' => 1])``Curl::post(string $url, mixed $data)`POST请求`Curl::post('/users', ['name' => 'x'])``Curl::put(string $url, mixed $data)`PUT请求`Curl::put('/users/1', $data)``Curl::delete(string $url)`DELETE请求`Curl::delete('/users/1')``Curl::create(string $url)`创建实例`Curl::create('/users')``->send()`发送请求`$curl->send()``->timeout(int $seconds)`超时时间`->timeout(30)``->headers(array $headers)`设置请求头`->headers(['Auth' => 'xxx'])``->withJson(mixed $data)`JSON数据`->withJson(['id' => 1])``->withForm(array $data)`表单数据`->withForm(['name' => 'x'])``->authorization(string $token)`Bearer认证`->authorization('xxx')``->proxy(string $host, int $port)`代理设置`->proxy('127.0.0.1', 8080)``->retry(int $times, int $delay)`重试机制`->retry(3, 1000)``->then(callable $onFulfilled)`成功回调`->then(fn($r) => $r->json())``->catch(callable $onRejected)`错误回调`->catch(fn($r) => $r->error)`### Response方法

[](#response方法)

方法说明示例`->isSuccess()`是否成功(2xx)`$res->isSuccess()``->isRedirect()`是否重定向(3xx)`$res->isRedirect()``->isClientError()`客户端错误(4xx)`$res->isClientError()``->isServerError()`服务端错误(5xx)`$res->isServerError()``->isJson()`是否JSON`$res->isJson()``->json()`获取JSON数据`$res->json()``->getContent()`获取内容`$res->getContent()``->getStatusCode()`状态码`$res->getStatusCode()`数组处理模块
------

[](#数组处理模块)

### 特性

[](#特性-3)

- ✅ 树形结构转换
- ✅ first/last/find 数组操作
- ✅ 深度合并
- ✅ 统计计算

### 快速开始

[](#快速开始-3)

```
use Kode\Array\Arr;

// 数组转树形
$tree = Arr::tree([
    ['id' => 1, 'parent_id' => 0, 'name' => 'A'],
    ['id' => 2, 'parent_id' => 1, 'name' => 'B'],
    ['id' => 3, 'parent_id' => 1, 'name' => 'C'],
], 'id', 'parent_id');
// 结果: [['id' => 1, 'parent_id' => 0, 'name' => 'A', 'children' => [...]]]

// 获取首尾元素
Arr::first([1, 2, 3]);
// 结果: 1
Arr::last([1, 2, 3]);
// 结果: 3

// 查找元素
Arr::find([1, 2, 3], fn($n) => $n > 1);
// 结果: 2

// 深度合并
Arr::deepMerge(['a' => 1], ['a' => 2, 'b' => 3]);
// 结果: ['a' => 2, 'b' => 3]
```

### 方法说明

[](#方法说明-3)

方法说明示例`Arr::tree(array $list, string $idField, string $parentIdField)`数组转树形`Arr::tree($list, 'id', 'pid')``Arr::list(array $tree, string $childrenField)`树形转数组`Arr::list($tree, 'children')``Arr::level(array $list, string $idField, string $parentIdField)`计算层级`Arr::level($list, 'id', 'pid')``Arr::path(array $list, string $idField, string $parentIdField, string $nameField)`获取路径`Arr::path($list, 'id', 'pid', 'name')``Arr::first(array $array)`获取第一个元素`Arr::first([1,2,3])``Arr::last(array $array)`获取最后一个元素`Arr::last([1,2,3])``Arr::find(array $array, callable $callback)`查找满足条件的元素`Arr::find($arr, fn($v)=>$v>1)``Arr::filter(array $array, callable $callback)`过滤数组`Arr::filter($arr, fn($v)=>$v>0)``Arr::map(array $array, callable $callback)`遍历修改`Arr::map($arr, fn($v)=>$v*2)``Arr::reduce(array $array, callable $callback, mixed $initial)`合并为单一值`Arr::reduce($arr, fn($c,$v)=>$c+$v, 0)``Arr::deepMerge(array $array1, array $array2)`深度合并`Arr::deepMerge($a1, $a2)``Arr::group(array $array, string $key)`分组`Arr::group($arr, 'category')``Arr::sort(array $array, string $key, string $order)`排序`Arr::sort($arr, 'id', 'asc')``Arr::unique(array $array)`去重`Arr::unique($arr)``Arr::chunk(array $array, int $size)`分块`Arr::chunk($arr, 10)``Arr::flatten(array $array)`扁平化`Arr::flatten($tree)``Arr::paginate(array $array, int $page, int $size)`分页`Arr::paginate($arr, 1, 10)``Arr::sum(array $array, string $key)`求和`Arr::sum($arr, 'price')``Arr::avg(array $array, string $key)`平均值`Arr::avg($arr, 'score')``Arr::max(array $array, string $key)`最大值`Arr::max($arr, 'price')``Arr::min(array $array, string $key)`最小值`Arr::min($arr, 'price')``Arr::random(array $array)`随机取一个`Arr::random($arr)``Arr::randomMany(array $array, int $num)`随机取多个`Arr::randomMany($arr, 3)``Arr::column(array $array, string $columnKey)`提取列`Arr::column($arr, 'name')``Arr::pluck(array $array, string $key)`提取值列表`Arr::pluck($arr, 'id')`字符串处理模块
-------

[](#字符串处理模块)

### 特性

[](#特性-4)

- ✅ 手机号/邮箱/身份证脱敏
- ✅ 驼峰/蛇形命名转换
- ✅ Base64编码解码
- ✅ UUID生成
- ✅ 字符串验证
- ✅ 格式转换

### 快速开始

[](#快速开始-4)

```
use Kode\String\Str;

// 脱敏
Str::maskPhone('13800138000');
// 结果: 138****8000
Str::maskEmail('user@example.com');
// 结果: us**@example.com

// 命名转换
Str::camel('hello_world');
// 结果: helloWorld
Str::snake('helloWorld');
// 结果: hello_world
Str::studly('hello_world');
// 结果: HelloWorld

// Base64
Str::toBase64('hello');
// 结果: aGVsbG8=
Str::fromBase64('aGVsbG8=');
// 结果: hello

// UUID
Str::uuid();
// 结果: a24e88d8-b560-4196-a34b-63626c1e489d

// 验证
Str::validatePhone('13800138000');
// 结果: true
Str::validateEmail('test@example.com');
// 结果: true
Str::validateIdCard('110101199001011234');
// 结果: true
```

### 方法说明

[](#方法说明-4)

方法说明示例**脱敏方法**`Str::maskPhone(string $phone)`手机号脱敏`Str::maskPhone('13800138000')``Str::maskEmail(string $email)`邮箱脱敏`Str::maskEmail('a@b.com')``Str::maskIdCard(string $idCard)`身份证脱敏`Str::maskIdCard('110101199001011234')``Str::maskBankCard(string $bankCard)`银行卡脱敏`Str::maskBankCard('6222021234567890')``Str::mask(string $str, int $start, int $length)`自定义脱敏`Str::mask('abc', 1, 1)`**命名转换**`Str::camel(string $str)`转驼峰`Str::camel('hello_world')``Str::snake(string $str)`转蛇形`Str::snake('helloWorld')``Str::studly(string $str)`转大驼峰`Str::studly('hello_world')`**编码转换**`Str::toBase64(string $str)`字符串转Base64`Str::toBase64('hello')``Str::fromBase64(string $base64)`Base64转字符串`Str::fromBase64('aGVsbG8=')``Str::toJson(mixed $data)`转JSON`Str::toJson(['a' => 1])``Str::fromJson(string $json)`JSON转数据`Str::fromJson('{"a":1}')``Str::toXml(array $data)`转XML`Str::toXml(['a' => 1])``Str::fromXml(string $xml)`XML转数组`Str::fromXml('1')``Str::toArray(string $str, string $delimiter)`字符串转数组`Str::toArray('a,b,c')``Str::fromArray(array $array, string $delimiter)`数组转字符串`Str::fromArray(['a','b'])`**字符串判断**`Str::contains(string $str, string $needle)`是否包含`Str::contains('hello', 'll')``Str::startsWith(string $str, string $prefix)`是否开头`Str::startsWith('hello', 'he')``Str::endsWith(string $str, string $suffix)`是否结尾`Str::endsWith('hello', 'lo')`**字符串截取**`Str::substr(string $str, int $start, ?int $length)`截取字符串`Str::substr('hello', 0, 3)``Str::mbSubstr(string $str, int $start, ?int $length)`中文截取`Str::mbSubstr('你好', 0, 1)``Str::truncate(string $str, int $length, string $suffix)`按长度截断`Str::truncate('abc', 2)``Str::limit(string $str, int $limit, string $end)`按显示宽度截断`Str::limit('你好世界', 5)``Str::length(string $str)`获取长度`Str::length('hello')``Str::mbLength(string $str)`中文长度`Str::mbLength('你好')`**字符串修改**`Str::replace(string $str, string $search, string $replace)`替换`Str::replace('a', 'b', 'a')``Str::remove(string $str, string $search)`删除`Str::remove('ab', 'b')``Str::reverse(string $str)`反转`Str::reverse('abc')``Str::shuffle(string $str)`随机打乱`Str::shuffle('abc')``Str::repeat(string $str, int $times)`重复`Str::repeat('a', 3)``Str::pad(string $str, int $length, string $pad, int $type)`填充`Str::pad('a', 5, '0', STR_PAD_LEFT)``Str::trim(string $str)`去空格`Str::trim(' abc ')``Str::ucfirst(string $str)`首字母大写`Str::ucfirst('hello')``Str::lcfirst(string $str)`首字母小写`Str::lcfirst('Hello')``Str::title(string $str)`首字母大写词`Str::title('hello world')`**验证方法**`Str::validatePhone(string $phone, string $region)`验证手机号`Str::validatePhone('13800138000')``Str::validateEmail(string $email)`验证邮箱`Str::validateEmail('a@b.com')``Str::validateIdCard(string $idCard)`验证身份证`Str::validateIdCard('110101199001011234')``Str::validateCarPlate(string $plate)`验证车牌`Str::validateCarPlate('京A12345')`**安全方法**`Str::sqlSafe(string $str, bool $strict)`SQL安全`Str::sqlSafe('abc')``Str::xssSafe(string $str, bool $strict)`XSS安全`Str::xssSafe('')``Str::htmlEscape(string $str)`HTML转义`Str::htmlEscape('
