brainite/splash

可链式SPL迭代器和自定义迭代器。

v1.0.0 2022-11-21 20:57 UTC

This package is auto-updated.

Last update: 2024-09-22 01:12:38 UTC


README

已测试与PHP 5.6/7.1/HHVM兼容

CI

Splash是一种可链式(因此简洁)的方式与SPL迭代器交互。标准PHP库(SPL)提供了各种实用类和接口来解决常见问题。其中一些最明显的解决方案集中在SPL迭代器上。遍历非数组集合,然后遍历该迭代器创建了一个有趣的设计模式,用于用PHP进行构建。然而,迭代器将简洁性放在次要位置,因此在某种程度上牺牲了可读性。

默认SPL迭代器使用示例

此示例摘自PHP手册

$objects = new RegexIterator(new RecursiveIteratorIterator(
  new RecursiveDirectoryIterator($path), RecursiveIteratorIterator::SELF_FIRST),
  '/^.+\.php$/i');
foreach ($objects as $object) {}

与非链式过程式代码一样,您必须以不自然且容易出错的方式从内部向外阅读。

Splash替代示例

\Splash\Splash::mount();
$objects = splash($path)->recursiveDirectory()
  ->recursiveIterator(RecursiveIteratorIterator::SELF_FIRST)
  ->regex('/^.+\.php$/i');
foreach ($objects as $object) {}

$object在foreach循环中的值应与上述方法相同。然而,现在迭代器和它们对应的构造函数值现在是线性组织和更少的代码,以提高可读性。最终,Splash的唯一目的是利用迭代器上下文中链式操作的好处。

入门指南

  1. 使用composer安装:brainite/splash
  2. 通过以下方法之一创建splash对象
    1. $splash = new \Splash\Splash(); // 这是一个基本的方法。
    2. $splash = \Splash\Splash::go(); // 这返回一个允许您立即链式操作的Splash对象。
    3. \Splash\Splash::mount(); // 这使得\splash()全局函数可供您使用,以实现更简洁的编码。它创建一个Splash对象,并将任何参数添加到要抛入初始对象的ArrayIterator中,通过push()方法添加。

等效示例

选项1

use Splash\Splash;
$test = new Splash();
$test->push(1)->push(2)->push(3);

选项2

use Splash\Splash;
$test = Splash::go()->push(1)->push(2)->push(3);

选项3

use Splash\Splash;
$test = Splash::go()->push(1, 2, 3);

选项4

\Splash\Splash::mount();
$test = splash(1, 2, 3);

更多示例,请查看单元测试。

Splash自定义迭代器

Splash附带了一些未包含在SPL中的迭代器。目前包括

InverseRegexIterator

这是一个简单的迭代器,排除任何与正则表达式匹配的项目。

$dat = splash('a', 'b')->inverseRegex('/a/')->toArray();
// $dat == array('b')

SliceIterator

这是一个简单的迭代器,将结果缩小到类似数组的切片。

$dat = splash('a', 'b', 'c')->slice(1, 1)->toArray();
// $dat == array('b')

CallbackIterator

这是一个运行回调函数针对每个元素的迭代器,允许回调返回TRUE以保留值(类似于CallbackFilterIterator),或者直接操作新的迭代器。直接高级选项允许通过回调拆分值。

/**
 * Callback for CallbackIterator
 *
 * @param $current   Current item's value
 * @param $key       Current item's key
 * @param $iterator  Iterator being traversed
 * @param $new_iterator Iterator being built (to allow item splits)
 * @return boolean   TRUE to auto-add the current item to $new_iterator, FALSE otherwise
 */
function my_callback(&$current, $key, $iterator, &$new_iterator) {
  $current = 'a';
  return TRUE;
}

$dat = splash('a', 'b', 'c')->callback('my_callback')->toArray();
// $dat == array('a', 'a', 'a')