khalyomede/monad
Composer 安装命令:
composer require khalyomede/monad
包简介
Maybe, Option and Result monads.
README 文档
README
Maybe, Option and Result monads for PHP.
Summary
About
I published on reddit an RFC proposal for what I called "enums constructor" (which happened to be an existing concept called "tagged unions"). Out of one comment, I shown how to chain calls to various ADT outcomes, in order to reduces pyramidal matches.
This got me into wanting to use more monads right now on my next projects. After searching on packagist.org, I did not found something that fits what I expected, so I decided to make my own version of how I think monads should look like in PHP.
Features
- Supports theses monads:
- Option
- Maybe
- Result
- PHPStan and static analyzers friendly
Prerequisites
- PHP 8+ installed
Installation
composer require khalyomede/monad
Examples
1. Getting a file content
In this example, we will use the Maybe monad as result, and use it in our main code.
use Khalyomede\Monad\Maybe; function getFileContent(string $filePath): Maybe { $content = file_get_contents($filePath); return $content === false ? Maybe::nothing() : Maybe::just($content); } // main $content = getFileContent("data.txt") ->then(fn (string $data): string => $data) ->catch(fn (): string => "N/A"); echo $content;
2. Get users from an SQL table
In this example, we will use the Result monad to return the list of users or an error from PDO.
use Khalyomede\Monad\Result; function getUsers(): Result { $pdo = new PDO("sqlite::memory:"); $statement = $pdo->prepare("SELECT * FROM users"); if ($statement === false) { $message = $pdo->errorInfo()[2]; return Result::error($message); } $result = $statement->execute(); if ($result === false) { $message = $statement->errorInfo()[2]; return Result::error($message); } return Result::ok($statement->fetchAll()); } // main $users = getUsers() ->then(fn (array $records): array => $records) ->catch(function (string $error): array { error_log($error); return []; });
3. Chain multiple outcomes
In this example, we will chain multiple times "then", similar to what is possible in other languages through "map".
use Khalyomede\Monad\Result; function getFileContent(string $path): Result { $content = file_get_contents($path); return $content === false ? Result::error(new Exception("Cannot get content of file $path.")) : Result::ok($content); } function saveFileContent(string $path, string $content): Result { $result = file_put_contents($path, $content); return $result === false ? Result::error(new Exception("Cannot write file content of file $path.")) : Result::ok(true); } // main $result = fileGetContent("composer.json") ->then(fn (string $content): Result => saveFileContent("composer.json.save", $content)) ->then(fn (): string => "composer.json backup finished.") ->catch(fn (Exception $exception): string => $exception->getMessage()); echo $result . PHP_EOL;
khalyomede@pc > php index.php
composer.json backup finished.
If you remove the file, the result becomes
khalyomede@pc > php index.php
Cannot get content of file composer.json.
If you remove the write permission on this file, the result becomes
khalyomede@pc > php index.php
Cannot write file content of file composer.json.save.
API
For a list of all possible functions, see the tests\unit folder.
Tests
composer run install-security-checker
composer run test
composer run mutate
composer run analyse
composer run check
composer outdated --direct
khalyomede/monad 适用场景与选型建议
khalyomede/monad 是一款 基于 PHP 开发的 Composer 扩展包,目前已累计 18 次下载、GitHub Stars 达 3, 最近一次更新时间为 2021 年 08 月 07 日, 在 PHP 生态内属于活跃度较高的组件。
它主要适用于以下技术方向: 「functional」 「programming」 「monad」 「ADT」 等业务场景。在实际项目中,围绕这些方向常见需要落地的问题包括:接口对接、性能调优、并发安全、与既有框架(Laravel / ThinkPHP / Yii / Webman 等)的兼容适配,以及生产环境的日志埋点与稳定性保障。
我们在过去多个企业项目中使用过 khalyomede/monad 或与其功能相近的方案,如果你在选型或落地过程中遇到问题,例如 版本兼容、二次改造、私有化封装、与内部系统对接、生产 BUG 排查,欢迎联系我们协助评估。
基于 khalyomede/monad 在你已有业务上做功能扩展、字段裁剪、UI 适配、与内部账号 / 权限 / 日志系统的深度对接。
线上偶发问题、内存泄漏、慢查询、并发异常等排查修复;针对高流量场景做缓存、队列、索引层面的调优。
承接完整的项目从需求 → 设计 → 开发 → 上线 → 长期运维;也可按月提供技术保姆服务。
与 khalyomede/monad 相关的其它包
同方向 / 同关键字的高下载量 PHP Composer 包推荐,方便对比选型:
Option type (Some/None) replacing nullable types with explicit presence semantics
Result type capturing success or failure as a value for controlled error handling
Connection 'Db' codeception module to 'Yii2' module database settings
A functional programming library for PHP. Inspired by Underscore, Lodash, and Ramda.
Functional library for php with proper currying
A collection of functional programming data structures
统计信息
- 总下载量: 18
- 月度下载量: 0
- 日度下载量: 0
- 收藏数: 3
- 点击次数: 6
- 依赖项目数: 0
- 推荐数: 0
其他信息
- 授权协议: MIT
- 更新时间: 2021-08-07