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 (external edit)