1.8 KiB
ParamNameMismatch
Emitted when method overrides a parent method but renames a param.
<?php
class A {
public function foo(string $str, bool $b = false) : void {}
}
class AChild extends A {
public function foo(string $string, bool $b = false) : void {}
}
Why is this bad?
PHP 8 introduces named parameters which allow developers to call methods with explicitly-named parameters;
<?php
function callFoo(A $a) {
$a->foo(str: "hello");
}
In the first example passing new AChild()
to callFoo()
results in a fatal error, as AChild's definition of the method foo()
doesn't have a parameter named $str
.
How to fix
You can change the child method param name to match:
<?php
class A {
public function foo(string $str, bool $b = false) : void {}
}
class AChild extends A {
public function foo(string $str, bool $b = false) : void {}
}
Workarounds
@no-named-params
Alternatively you can ignore this issue by adding a @no-named-params
annotation to the parent method:
<?php
class A {
/** @no-named-params */
public function foo(string $str, bool $b = false) : void {}
}
class AChild extends A {
public function foo(string $string, bool $b = false) : void {}
}
Any method with this annotation will be prevented (by Psalm) from being called with named parameters, so the original issue does not matter.
Config allowInternalNamedParamCalls="false"
You can also set a config flag that tells Psalm to prohibit any named parameter calls on @internal
classes or methods.
With that config value, this is now allowed:
<?php
/**
* @internal
*/
class A {
public function foo(string $str, bool $b = false) : void {}
}
class AChild extends A {
public function foo(string $string, bool $b = false) : void {}
}