The note about detecting nullability on a parameter predates "?type" and other union types. Null isn't expected to be the default if there's a defined type that allows it ("?int", "mixed", "int|string|null", etc.).
<?php
function foo($bar) { }
(new ReflectionFunction('foo'))->getParameters()[0]->allowsNull();
function foo(string $bar) { }
(new ReflectionFunction('foo'))->getParameters()[0]->allowsNull();
function foo(?string $bar) { }
(new ReflectionFunction('foo'))->getParameters()[0]->allowsNull();
function foo(?string $bar = 'baz') { }
(new ReflectionFunction('foo'))->getParameters()[0]->allowsNull();
function foo(string $bar = null) { }
(new ReflectionFunction('foo'))->getParameters()[0]->allowsNull();
?>