Named arguments make parameter names public API

A method with six optional parameters produced calls full of nulls to reach the seventh, and naming them fixes the call site at the cost of freezing every parameter name.

// before
http_build_query($data, '', '&', PHP_QUERY_RFC3986);

// after
http_build_query($data, encoding_type: PHP_QUERY_RFC3986);

// and the consequence for anything you publish:
public function send(string $to, string $body, bool $html = false) {}
// renaming $body to $content is now a BREAKING change

For a library this is a real constraint that arrived without anyone opting into it: parameter names were previously an implementation detail and are now part of the signature. The mitigation for anything internal is that you control both sides; for a package it means treating a rename as a major version. Mixing positional and named arguments works provided every positional one comes first, which is the rule people forget under pressure.