Named arguments through an interface are a gamble

PHP does not require an implementation to use the same parameter names as the interface it satisfies, so a named argument through an interface type is only as safe as every implementation.

interface Cache
{
    public function put(string $key, mixed $value, int $ttl = 3600): void;
}

final class RedisCache implements Cache
{
    // entirely legal
    public function put(string $k, mixed $v, int $seconds = 3600): void {}
}

$cache->put(key: 'a', value: 1, ttl: 60);
// Error: Unknown named parameter $key — depending on
// which implementation was injected

This is the one place named arguments introduce a runtime failure the type system would normally have caught, and it is invisible in review because the interface looks like a contract. The practical defences are a static analyser rule requiring matching names, or a convention of positional calls through interfaces and named calls only against concrete classes. Neither is enforced by the language, which is worth knowing before adopting named arguments across a codebase with many implementations.