8.1 gave pure intersection types and no way to make one nullable; 8.2 allows a union of intersections, which covers the case everybody hit first.
// 8.1: not expressible at all
function f(?(Countable&Traversable) $rows) {} // parse error
// 8.2 — disjunctive normal form: a union OF intersections
function f((Countable&Traversable)|null $rows) {}
function g((A&B)|(C&D)|int $x) {}
// still not allowed: an intersection OF unions
function h((A|B)&C $x) {} // parse error
The name describes the shape rather than the feature: any combination of unions and intersections can be rewritten as a union of intersections, and that normal form is what the engine accepts. The parentheses are mandatory around each intersection even where the precedence would be unambiguous, which reads as noise and removes an entire category of misreading.