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: * [[rfc:functional-elements:call-iterator|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 * [[rfc::functional-elements:is-traversable|function is_traversable()]]: Returns true if a list is traversable (Iterator/IteratorAggregate/array) * [[rfc:functional-elements:iterate|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);