phpStan 错误的问题:__toString() 应该返回字符串但返回字符串|false

Posted

技术标签:

【中文标题】phpStan 错误的问题:__toString() 应该返回字符串但返回字符串|false【英文标题】:Problem with phpStan error : __toString() should return string but returns string|false 【发布时间】:2020-06-12 18:20:09 【问题描述】:

我的功能是__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,如here 所述。如果由于某种原因无法对$payload 进行编码,它将返回false 而不是字符串。

正如您所发现的,除非您升级到 7.4,否则不接受在 __toString() 中抛出异常(越早越好!:))

这将是修复您的toString() 声明的简单方法,以确保您始终返回一个字符串。

public function __toString(): string

    return json_encode($this->payload) ?: '';

【讨论】:

以上是关于phpStan 错误的问题:__toString() 应该返回字符串但返回字符串|false的主要内容,如果未能解决你的问题,请参考以下文章

PHP代码静态分析工具PHPStan

Laravel 错误:方法 Illuminate\View\View::__toString() 不能抛出异常

致命错误:方法 class@anonymous::__toString() 在作曲家安装后不得抛出异常

php魔术方法__tostring

php魔术方法__tostring的应用

PHP魔术方法之__toString()方法