【问题标题】:phpstan not using outcome of functionphpstan 不使用函数的结果
【发布时间】:2023-01-09 19:16:52
【问题描述】:

我有一个检查值是否为 null 的函数,在我调用该函数后,我使用了显然不为 null 的值。

但 phpstan 仍然说它可能为空。

你们有没有让 phpstan 知道这个函数的结果的解决方案。

protected ?string $filterCacheKey = null;
protected function usesFilterCaching(): bool
{
    return $this->filterCacheKey !== null;
}

方法 Illuminate\Contracts\Session\Session::get() 的参数 #1 $key 需要字符串,string|null 给定。

if ($this->usesFilterCaching() && $this->request()->method() === Request::METHOD_GET) {
    $sessionCacheFilters = $this->filterStore()->get($this->filterCacheKey);

    return Arr::get($sessionCacheFilters, $filterName, $defaultChecked);
}

【问题讨论】:

  • $this->filterCacheKey的签名是什么?就像您在代码运行期间检查它一样,静态分析使用的签名可能表明它可以为空。
  • @NigelRen 好的评论我已经添加了它
  • 我认为问题可能是您正在检查是否设置了密钥,然后使用它获取不存在的数据。我认为您应该检查键是否存在并且存储在该键索引处是否有价值,然后才恢复

标签: php laravel phpstan


【解决方案1】:

我认为你的问题就在这里:

$sessionCacheFilters = $this->filterStore()->get($this->filterCacheKey); 

$this->filterStore()$this->filterCacheKey 没有值

所以我认为你的支票应该是:

if ($this->usesFilterCaching() && $this->filterStore()->get($this->filterCacheKey) != null && $this->request()->method() === Request::METHOD_GET)

【讨论】:

    【解决方案2】:

    尽管您的代码在使用前明确检查了 null 值,但 phpstan 不会检查调用的方法。它是一个静态分析工具,只会坚持参数类型和返回类型,而不是检查被调用函数内部发生的情况。

    作为此问题的快速解决方法,我建议完全删除 usesFilterCaching 函数,因为它可以用一个简单的如果像这样检查:

    if ($this->filterCacheKey && $this->request()->method() === Request::METHOD_GET) {
        $sessionCacheFilters = $this->filterStore()->get($this->filterCacheKey);
    
        return Arr::get($sessionCacheFilters, $filterName, $defaultChecked);
    }
    

    这将执行相同的空检查,如果变量为空,则不会执行代码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-12-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-13
      • 1970-01-01
      • 2019-01-24
      相关资源
      最近更新 更多