brainite / splash
可链式SPL迭代器和自定义迭代器。
v1.0.0
2022-11-21 20:57 UTC
Requires
- php: >=5.3.3
This package is auto-updated.
Last update: 2024-09-22 01:12:38 UTC
README
已测试与PHP 5.6/7.1/HHVM兼容
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的唯一目的是利用迭代器上下文中链式操作的好处。
入门指南
- 使用composer安装:brainite/splash。
- 通过以下方法之一创建splash对象
$splash = new \Splash\Splash();
// 这是一个基本的方法。$splash = \Splash\Splash::go();
// 这返回一个允许您立即链式操作的Splash对象。\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')