Псалом: метод дескриптора, который возвращает несколько типов - PullRequest
0 голосов
/ 31 января 2020

РЕДАКТИРОВАТЬ Это псалом, а не PHP MD.

Я пишу Symfony консольную команду. В его методе execute я получаю аргумент с помощью метода $input->getArgument('argument_name'). И я передаю это значение службе, которая ожидает, что это значение будет иметь строковый тип.

Общий код:

    protected function execute(InputInterface $input, OutputInterface $output)
    {
        if (is_string($input->getArgument('identifier'))) {
            $identifier = $input->getArgument('identifier');
        } else {
            return 2;
        }
        if ($input->getArgument('mode') === "vehicle") {
            $this->vehicleService->getVehicleInfo($identifier);
            return null;
        }
        if ($input->getArgument('mode') === "company") {
            $this->vehicleService->getCompanyVehiclesInfo($identifier);
            return null;
        }
        return 1;
    }

PHP MD Псалом не не вижу, что я подтвердил, что $identifier является строкой, прежде чем передать ее в качестве аргумента одному из vehicleService методов и выдает ошибку PossiblyInvalidArgument, потому что Argument 1 ... expects string, possibly different type array<array-key, string>|null|string provided.

Как я могу PHP MD гарантирует, что это строка?

1 Ответ

0 голосов
/ 31 января 2020

Я понял это после нескольких попыток. Мне нужно было положить все в проверку if (is_string(...)):

    protected function execute(InputInterface $input, OutputInterface $output)
    {
        $identifier = $input->getArgument('identifier');
        if (is_string($identifier)) {
            if ($input->getArgument('mode') === "vehicle") {
                $this->vehicleService->getVehicleInfo($identifier);
                return null;
            }
            if ($input->getArgument('mode') === "company") {
                $this->vehicleService->getCompanyVehiclesInfo($identifier);
                return null;
            }
        } else {
            return 2;
        }
        return 1;
    }
...