Проблема с ошибкой phpStan: __toString() должен возвращать строку, но возвращает строку |false

Моя функция __toString:

public function __toString(): string
{
    return json_encode($this->payload);
}

Это ошибка, которую я получаю от PhpStan, не позволяя мне совершить фиксацию:

Метод App\DTO\GenericMessageDTO::__toString() должен возвращать строку, но возвращает строку |false.

Я пробовал с исключением, но несовместим с моим php 7.2, он говорит, что выброс исключения из '__toString' возможен только с PHP 7.4

public function __toString(): string
{
    if ($this->payload === false) {
        throw new \Exception("No payload");
    }
    return json_encode($this->payload);
}

Как я могу это исправить?

1 ответ

Решение

Вы возвращаетесь из json_encode напрямую, и эта устаревшая функция имеет тип возврата string|false, как описано здесь. Если по какой-либо причине не удается кодировать$payload, он вернется false вместо строки.

И, как вы обнаружили, исключение в __toString() не принимается, если вы не обновитесь до 7.4 (чем раньше, тем лучше!:))

Это был бы простой способ исправить вашу toString()декларацию, чтобы всегда возвращать строку.

public function __toString(): string
{
    return json_encode($this->payload) ?: '';
}
Другие вопросы по тегам