gabrielalmir/maybe
Composer 安装命令:
composer require gabrielalmir/maybe
包简介
Functional primitives for PHP: Option and Result types inspired by Rust
README 文档
README
Maybe is a PHP library for explicit and predictable business logic.
It combines 5 main building blocks:
Option<T>: safe flow for optional valuesResult<T, E>: typed success/error without exceptions as control flowSchema: immutable parsing and validationDTO: validated mapping for input objectsAsync: concurrent execution via processes (proc_open) focused on PHP 7.4 + Windows + CI3
Adoption Guides
New users in corporate or legacy environments should start with Schema, DTO, and Result before adopting Async. Detailed adoption guidance lives in docs/ so this README can remain a compact API overview.
- Corporate Adoption Guide
- CodeIgniter 3 Guide
- Usage Patterns
- Practical Recipes
- Anti-Patterns
- Incremental Migration
- Async Safety Guide
Requirements
- PHP
>= 7.4 - Composer
Installation
composer require gabrielalmir/maybe
Dependencies
- Main runtime: no extra mandatory dependencies
Asyncmodule: usesopis/closurefor closure serialization
API Overview
Option
use Maybe\Option\Option; $name = Option::fromNullable($payload['name'] ?? null) ->map('trim') ->flatMap(static function (string $value): Option { return $value === '' ? Option::none() : Option::some($value); }) ->unwrapOr('guest');
Main methods:
map(callable $fn): OptionflatMap(callable $fn): Optionmatch(callable $onSome, callable $onNone)unwrap(),unwrapOr($default)isSome(),isNone()
Result
use Maybe\Result\Result; function loadUser(int $id): Result { if ($id <= 0) { return Result::err('invalid_id'); } return Result::ok(['id' => $id, 'name' => 'Ana']); } $message = loadUser(10)->match( static fn (array $user): string => 'User: ' . $user['name'], static fn (string $error): string => 'Error: ' . $error );
Main methods:
map(callable $fn): ResultmapErr(callable $fn): Resultmatch(callable $onOk, callable $onErr)unwrap(),unwrapErr()isOk(),isErr()
Schema
use Maybe\Schema\Schema; $schema = Schema::shape([ 'email' => Schema::string()->trimmed()->min(5), 'age' => Schema::int()->min(18), ]); $result = $schema->safeParse([ 'email' => ' user@example.com ', 'age' => 23, ]);
Available builders:
Schema::string(),Schema::int(),Schema::bool(),Schema::date()Schema::enumeration([...])Schema::arrayOf(...)Schema::shape([...])Schema::option(...)
DTO
use Maybe\DTO\DTO; use Maybe\Schema\ObjectSchema; use Maybe\Schema\Schema; final class CustomerDTO extends DTO { /** @var string */ public $email; private function __construct(string $email) { $this->email = $email; } public static function schema(): ObjectSchema { return Schema::shape([ 'email' => Schema::string()->trimmed()->min(5), ]); } protected static function fromValidated(array $validated) { return new self($validated['email']); } } $dtoResult = CustomerDTO::fromArray(['email' => 'ana@example.com']);
Entry points:
DTO::fromArray($input)returnsResult<DTO, ValidationErrorBag>DTO::parse($input)throws an exception on validation error
Async
$result = await(async(static function (): int { usleep(100000); return 42; }));
Features:
async(callable $task, array $args = [], array $options = [])await($futureOrArray)Async::all([...])Async::race([...])Async::pool($tasks, $limit)AsyncFuture::then()->catch()->finally()->resolve()pending(),cancel(), per-task timeout (['timeout' => 2.5])
Functional Helpers
The following functions are auto-loaded:
- Option/Result:
some(),none(),fromNullable(),ok(),err() - Schema:
stringSchema(),intSchema(),boolSchema(),dateSchema(),enumSchema(),arraySchema(),objectSchema(),optionSchema() - Async:
async(),await()
Global aliases are also available for CI3 compatibility:
AsyncAsync_future
CodeIgniter 3
With Composer loaded in the project:
$this->load->library('async'); $value = await(async(static function (): int { return 123; }));
Async Limitations
- Processes are isolated (no shared memory)
- Non-serializable resources must be recreated in the child process
- There is process spawn overhead per task
Development
composer lint composer test:async
Note: the legacy
testrunner uses Pest 1.x. On very new PHP versions, prefertest:asyncto validate the async module.
Async Examples
Run the examples directly:
php examples/async-basic.php php examples/async-all-race.php php examples/async-pool.php php examples/async-chain-timeout-cancel.php
gabrielalmir/maybe 适用场景与选型建议
gabrielalmir/maybe 是一款 基于 PHP 开发的 Composer 扩展包,目前已累计 2 次下载、GitHub Stars 达 0, 最近一次更新时间为 2026 年 02 月 26 日, 在 PHP 生态内属于活跃度较高的组件。
它主要适用于以下技术方向: 「php」 「functional」 「option」 「monad」 「maybe」 「result」 等业务场景。在实际项目中,围绕这些方向常见需要落地的问题包括:接口对接、性能调优、并发安全、与既有框架(Laravel / ThinkPHP / Yii / Webman 等)的兼容适配,以及生产环境的日志埋点与稳定性保障。
我们在过去多个企业项目中使用过 gabrielalmir/maybe 或与其功能相近的方案,如果你在选型或落地过程中遇到问题,例如 版本兼容、二次改造、私有化封装、与内部系统对接、生产 BUG 排查,欢迎联系我们协助评估。
基于 gabrielalmir/maybe 在你已有业务上做功能扩展、字段裁剪、UI 适配、与内部账号 / 权限 / 日志系统的深度对接。
线上偶发问题、内存泄漏、慢查询、并发异常等排查修复;针对高流量场景做缓存、队列、索引层面的调优。
承接完整的项目从需求 → 设计 → 开发 → 上线 → 长期运维;也可按月提供技术保姆服务。
与 gabrielalmir/maybe 相关的其它包
同方向 / 同关键字的高下载量 PHP Composer 包推荐,方便对比选型:
Connection 'Db' codeception module to 'Yii2' module database settings
Console Configuration Helper implementation.
Functional library for php with proper currying
Iteration tools for PHP
Maybe for PHP
Rust like enum Result and Option.
统计信息
- 总下载量: 2
- 月度下载量: 0
- 日度下载量: 0
- 收藏数: 0
- 点击次数: 27
- 依赖项目数: 0
- 推荐数: 0
其他信息
- 授权协议: MIT
- 更新时间: 2026-02-26