PHPStan - изменить тип параметра конструктора
При запуске PHPStan на моей кодовой базе я получаю сообщение об ошибке:
Parameter #2 $credentials of class Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken constructor expects string, null given.
Это связано с тем, что в блоке конструктора указывается только строка как допустимый тип. Но когда вы проверяете eraseCredentials()
метод, кажется, что null
также является действительным значением для $credentials
,
Теперь я хочу проинструктировать PHPStan, что тип $credentials
параметр string|null
в отличие от string
,
Я думаю, что мне нужна реализация MethodsClassReflectionExtension
сделать это. Но когда я регистрирую это, это, кажется, не вызвано для правильного класса.
Моя текущая реализация:
class UsernamePasswordToken implements MethodsClassReflectionExtension
{
public function hasMethod(ClassReflection $classReflection, string $methodName): bool
{
if ($classReflection->getName()===\Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken::class) {
var_dump(__FILE__ . ':' . __LINE__ . ' :: ' . __METHOD__);die();
}
if ($methodName === '__construct' && $classReflection->getName() === UsernamePasswordTokenClass::class) {
return true;
}
return false;
}
public function getMethod(ClassReflection $classReflection, string $methodName): MethodReflection
{
var_dump(__FILE__ . ':' . __LINE__ . ' :: ' . __METHOD__);die();
}
}
Что мне нужно сделать, чтобы PHPStan понял, что $credentials
собственность принимает оба string
а также null
ценности?
1 ответ
К сожалению, вы не можете использовать расширения для переопределения информации о существующем методе. В настоящее время нет способа убедить PHPStan, что метод имеет сигнатуру, отличную от сигнатуры в коде.
Я немного растерялся из-за сообщенной ошибки, потому что UsernamePasswordToken в настоящее время принимает mixed
(что-то значит) как тип $credentials
, Таким образом, ваша проблема может исчезнуть, просто обновив Symfony (не знаю, какая версия). А также я не знаю, что вы имеете в виду, ссылаясь на eraseCredentials
метод.
Если вам нужно решить аналогичную проблему и документация по параметрам неверна даже в последней версии вашей зависимости, у вас есть два варианта:
1) Отправьте PR в зависимость, которая исправляет их typehint или phpDoc.
2) Написать регулярное выражение для ignoreErrors
(см. README), которая игнорирует эту проблему.
В будущем будет третий вариант. Я планирую включить переопределение сторонних типов, предлагая варианты конфигурации для этого.