Intersection types cannot be nullable until 8.2

Pure intersection types in 8.1 mean class and interface types only, which excludes the nullable case that most signatures need.

// 8.1
function f(Countable&Traversable $rows) {}     // fine
function g(?(Countable&Traversable) $rows) {}  // parse error
function h(Countable&null $rows) {}            // parse error

// so the 8.1 workaround, which is a real cost:
function f(Countable&Traversable $rows) {}
function fOrNothing(?iterable $rows) {}   // a second method

The restriction to class types is what “pure” means and it rules out exactly the combination people reach for first. Within the limit it still removes real ceremony: a marker interface that existed only to name a combination, and the retrofit onto a third-party class that was never possible at all. DNF types in 8.2 lift the restriction three weeks before the end of the year.