Search by

fiberphp / support

fiberphp

🧰 FiberPHP 支持工具 —— Arr/Str/Collection 通用工具类与全局助手函数,零依赖,开箱即用。

Package info

gitee.com/fiberphp/support.git

Issues

pkg:composer/fiberphp/support

Statistics

Installs: 11

Dependents: 9

Suggesters: 0

v0.1.0 2026-09-12 09:43 UTC

This package is auto-updated.

Last update: 2026-09-12 09:48:50 UTC


README

FiberPHP 支持工具库,提供 Arr / Str / Collection / Pipeline 通用类与一组全局助手函数。

环境要求

  • PHP >= 8.3
  • ext-json
  • ext-mbstring

无任何 Composer 运行时依赖。

安装

composer require fiberphp/support

Arr

数组操作工具,支持「点号」多维取值与多种变换:

use FiberPHP\Support\Arr;

// 点号取值
Arr::get($array, 'user.address.city', 'default');
Arr::set($array, 'a.b.c', 1);
Arr::has($array, 'a.b.c');

// 变换
Arr::only($array, ['id', 'name']);
Arr::except($array, ['password']);
Arr::pluck($rows, 'name', 'id');          // 二维数组提取列
Arr::flatten($array, 1);                  // 降维
Arr::collapse([[1, 2], [3, 4]]);          // [1, 2, 3, 4]
Arr::first($array, fn ($v) => $v > 0);
Arr::where($array, fn ($v) => is_string($v));

// 树/深合并
Arr::toTree($flatList, 'id', 'pid', 'children');
Arr::mergeDeep($a, $b);

主要方法:accessible / add / collapse / crossJoin / divide / dot / except / exists / first / last / flatten / forget / get / has / isAssoc / only / pluck / prepend / pull / random / set / shuffle / sort / sortRecursive / query / where / wrap / mergeDeep / flatMap / toTree

Str

字符串工具,内置 mbstring 多字节安全方法,命名风格转换有进程内缓存:

use FiberPHP\Support\Str;

Str::contains('hello world', ['hello', 'hi']);
Str::startsWith('HelloPHP', 'Hello');
Str::endsWith('user_id', '_id');
Str::length('你好');                       // 2
Str::substr('你好世界', 1, 2);             // '好世'
Str::lower('ABC'); Str::upper('abc');
Str::snake('UserService');                // 'user_service'
Str::camel('user_name');                  // 'userName'
Str::studly('user_name');                 // 'UserName'
Str::title('hello world');               // 'Hello World'
Str::random(16);                         // 随机字符串

Collection

继承 ArrayObject,天然实现 Countable / IteratorAggregate / ArrayAccess / JsonSerializable,对数组的链式封装:

use function FiberPHP\Support\collect;

$items = collect(['apple', 'banana', 'cherry'])
    ->map(fn ($v) => strtoupper($v))
    ->filter(fn ($v) => str_starts_with($v, 'B'))
    ->values();

collect($users)
    ->each(fn ($u) => $u->save())
    ->pluck('name')
    ->chunk(10)
    ->sort();

主要方法:first / last / each / map / filter / contains / reduce / chunk / sort / slice / merge / pluck / flip / keys / values / isEmpty / toArray / all

助手函数

src/helpers.php 全局函数(if (!function_exists(...)) 防冲突):

函数说明
value($value)解析 Closure 为返回值,非闭包原样返回
collect(?array $v)创建 Collection
data_get($target, $key, $default)点号取值,支持 * 通配符(数组与对象)
data_set(&$target, $key, $value, $overwrite)点号设值,* 通配符批量设值
data_fill(&$target, $key, $value)仅在缺失时设值(data_set$overwrite=false
copy_dir($source, $dest, $overwrite)递归拷贝目录或文件
remove_dir($dir)递归删除目录、文件、符号链接
get_realpath($path)真实路径(phar:// 协议原样返回)
cpu_count()CPU 核心数(Linux 解析 /proc/cpuinfo,其他回退 4)
// 点号 + 通配符取值
data_get($users, '*.name');               // 所有用户的 name
data_get($order, 'items.*.price');        // 订单所有商品价格

Pipeline

洋葱模型管道构造器,用于 HTTP 中间件等「层层包裹 + 传递」场景:

use FiberPHP\Support\Pipeline;

$pipeline = Pipeline::build(
    [$middleware1, $middleware2],
    fn($request) => $response,
    fn(Throwable $e, $request) => $errorResponse,
);

$response = $pipeline($request);
  • build(): 构造可缓存的洋葱闭包,零 Fiber 依赖,可单独使用
  • run(): 在独立 Fiber 中执行管道,支持中间件内 Fiber::suspend() 挂起;已在协程上下文时自动降为同步执行

目录结构

src/
├── Arr.php          # 数组工具(30+ 静态方法)
├── Str.php          # 字符串工具(含 snake/camel/studly 缓存)
├── Collection.php   # 通用集合(ArrayObject 链式封装)
├── Pipeline.php     # 洋葱模型管道构造器
└── helpers.php      # 全局助手函数

License

MIT