//Given:
function stuff(int $i, string $s, float $f, Point $p, int $m = 0) {}
// Each of these blocks contain equivalent statements.
stuff(?, ?, ?, ?, ?);
stuff(?, ?, ...);
stuff(...);
fn(int $i, string $s, float $f, Point $p, int $m = 0) => stuff($i, $s, $f, $p, $m = 0);
stuff(1, 'hi', ?, ?, ?);
stuff(1, 'hi', ...);
fn(float $f, Point $p, int $m = 0) => stuff(1, 'hi, $f, $p, $m = 0);
stuff(1, ?, 3.5, ?, ?);
stuff(1, ?, 3.5, ...);
fn(string $s, Point $p, int $m = 0) => stuff(1, $s, 3.5, $p, $m = 0);
stuff(?, ?, ?, ?, 5);
fn(int $i, string $s, float $f, Point $p) => stuff($i, $s, $f, $p, 5);
stuff(?, ?, ?, ?); // Not accounting for an optional argument means it will always get its default value.
fn(int $i, string $s, float $f, Point $p) => stuff($i, $s, $f, $p);
stuff(?, ?, f: 3.5, p: $point);
stuff(?, ?, p: $point, f: 3.5);
fn(int $i, string $s) => stuff($i, $s, f: 3.5, p: $point);
stuff(?, ?, f: 3.5, p: $point, ...);
fn(int $i, string $s, int $m = 0) => stuff($i, $s, 3.5, $point, $m);
// And the following are all errors, for the reasons given:
// Insufficient parameters.
stuff(?);
// Parameter $i used more than once.
stuff(?, ?, 3.5, $point, i: 5);
// Positional argument used after named argument.
stuff(i:1, ?, ?, ?, ?);
// Cannot use placeholder on named arguments.
stuff(1, ?, 3.5, p: ?);
// Cannot use positional placeholder after named argument.
// (But the variadic would work, I think? Only if feasible.)
stuff(?, ?, ?, p: $point, ?);