marcegarba / funccoll
PHP 函数集合库
Requires
- php: >=5.4
Requires (Dev)
- phpunit/phpunit: 4.*
- satooshi/php-coveralls: @stable
This package is not auto-updated.
Last update: 2024-09-28 15:08:27 UTC
README
这个小库受到了 Martin Fowler 的 collection pipeline 模式的启发,旨在在 PHP 中实现此模式。
文章中 Ruby 和 Clojure 的示例之美与 PHP 中 lambda(闭包)笨拙的语法形成对比;尽管如此,我的意图是使在 PHP 中创建集合管道变得容易。
安装
您可以通过 composer 包在 Packagist 中获取此 PHP 库。只需将此依赖项添加到您的 composer.json
{ "require": { "marcegarba/funccoll": "@stable" } }
工作原理
Collection
类实现了一个不可变的集合,由一个数组支持。
该类有两个静态工厂方法,fromArray()
和 generate()
。
前者通过传递一个 PHP 数组创建一个 Collection 对象。
后者使用闭包生成集合元素。
不可变性
每次转换都会创建一个新的集合对象。
该类本身实现了 ArrayAccess
和 Countable
,因此它可以在某种程度上用作数组;但它没有实现 Iterator
(通过使用 foreach
语言结构遍历集合),因为这将意味着有一个计数器,从而使类实例可变。
由于不可变性,ArrayAccess
接口的 offsetSet()
和 offsetUnset()
的实现抛出 LogicException
。
显然,不可变性是与集合本身有关,而不是其元素的状态。
提取数组
toArray()
方法提取原始数组。
如果需要进行任何更改,则应在此数组上执行。当然,可以用于创建另一个 Collection 对象的更改后的数组。
示例
这里有一些简单示例,使用了两个工厂方法。
示例 1:添加奇数乘以二
使用从 1 到 10 的连续数字列表生成第一个对象;然后应用连续的转换,以获得前三个奇数的双倍总和。
use Marcegarba\FuncColl\Collection; $sum = Collection::fromArray(range(1, 10)) ->filter(function ($elem) { return $elem % 2 != 0; }) ->take(3) ->map(function ($elem) { return $elem * 2; }) ->reduce(function ($acc, $num) { return $acc + $num; }); echo $sum; // Outputs 18
示例 2:从 PDO 查询中提取行
本例使用PDO查询的结果生成一个关联数组列表(最多包含100个元素),然后每个数组都用于创建一个实体对象,基于该行的内容,并将生成的实体对象数组存储在一个变量中。
use Marcegarba\FuncColl\Collection; $pdo = new PDO(...); $stmt = $pdo->query('SELECT * from items'); $generator = function () use ($stmt) { return $stmt->fetch(PDO_ASSOC); } $items = Collection::generate($generator, 100) ->map(function ($row) { return new Item($row); });
方法总结
以下是按字母顺序排序的主要实例方法