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), которая игнорирует эту проблему.

В будущем будет третий вариант. Я планирую включить переопределение сторонних типов, предлагая варианты конфигурации для этого.

Другие вопросы по тегам