rfc:functional-elements
This RFC is still in progress
Functional elements to work with aggregations
Abstract
A common pattern in PHP is iterating through a list of objects and executing certain methods of the objects. This is especially common when it comes to 1:n-relations (e.g. one object, n adapters). This proposal is meant to abstract those iterations in convenient functional constructs by adding method call iterators and iterator functions.
Current usage patterns
UC-1: Iterating over an aggregation of objects
foreach ($list as $element) { $element->method(); }
UC-2: Iterating over an aggregation of objects and keeping the results
$result = array(); foreach ($list as $element) { $result[] = $element->method(); }
UC-3: Iterating over an aggregation of objects and conditionally executing a method
foreach ($list as $element) { if ($element->conditionalMethod()) { $element->method(); } }
UC-4: Iterating over an aggregation of objects and conditionally executing a method while keeping the results
$result = array(); foreach ($list as $element) { if ($element->conditionalMethod()) { $result[] = $element->method(); } }
Required functionality
Extracting the required functionality to leads to the following required additions:
- class CallIterator: a simple iterator which walks over a traversable list (including arrays) and calls a specified method. The CallIterator might optionally gather the results
- function is_traversable(): Returns true if a list is traversable (Iterator/IteratorAggregate/array)
- function iterate(): Walks over a traversable list and does nothing
- function iterator_true(): Walks over a traversable list and assumes every element to be bool(true)
- function iterator_false(): Walks over a traversable list and assumes every element to be bool(false)
Modified use cases
UC-1: Iterating over an aggregation of objects
iterate(new CallIterator($list, 'method'));
UC-2: Iterating over an aggregation of objects and keeping the results
$result = iterate(new CallIterator($list, 'method'), true);
rfc/functional-elements.txt · Last modified: 2017/09/22 13:28 by 127.0.0.1