英文:
phpstan not using outcome of function
问题
protected ?string $filterCacheKey = null;
protected function usesFilterCaching(): bool
{
return $this->filterCacheKey !== null;
}
> Parameter #1 $key of method Illuminate\Contracts\Session\Session::get() expects string, string|null given.
if ($this->usesFilterCaching() && $this->request()->method() === Request::METHOD_GET) {
$sessionCacheFilters = $this->filterStore()->get($this->filterCacheKey);
return Arr::get($sessionCacheFilters, $filterName, $defaultChecked);
}
英文:
I have a function that checks if a value is null and after I call that function I use the value that is obviously not null.
but phpstan still says it could be null.
Do you guys have any solution for phpstan to know the outcome of this function.
protected ?string $filterCacheKey = null;
protected function usesFilterCaching(): bool
{
return $this->filterCacheKey !== null;
}
> Parameter #1 $key of method Illuminate\Contracts\Session\Session::get() expects string, string|null given.
if ($this->usesFilterCaching() && $this->request()->method() === Request::METHOD_GET) {
$sessionCacheFilters = $this->filterStore()->get($this->filterCacheKey);
return Arr::get($sessionCacheFilters, $filterName, $defaultChecked);
}
答案1
得分: 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)
英文:
I think your problem is right here:
$sessionCacheFilters = $this->filterStore()->get($this->filterCacheKey);
$this->filterStore()
does not have a value at key $this->filterCacheKey
So I think your check should be:
if ($this->usesFilterCaching() && $this->filterStore()->get($this->filterCacheKey) != null && $this->request()->method() === Request::METHOD_GET)
答案2
得分: 0
尽管您的代码明显在使用之前检查了空值,但phpstan不会检查调用的方法。它是一个静态分析工具,仅关注参数类型和返回类型,而不关注在调用的函数内发生了哪些检查。
作为解决这个问题的快速临时方法,我建议完全删除usesFilterCaching
函数,因为它可以用一个简单的if检查来替代,如下所示:
if ($this->filterCacheKey && $this->request()->method() === Request::METHOD_GET) {
$sessionCacheFilters = $this->filterStore()->get($this->filterCacheKey);
return Arr::get($sessionCacheFilters, $filterName, $defaultChecked);
}
这将执行相同的空值检查,如果变量为空,代码将不会执行。
英文:
Although your code is clearly checking the null value before it is used, phpstan does not check called methods. It is a static analysis tool that will only stick to parameter types and return types, not what checks occur inside a called function.
As a quick workaround for this problem, I would suggest removing the usesFilterCaching
function altogether as it can be replaced with a simple if check like so:
if ($this->filterCacheKey && $this->request()->method() === Request::METHOD_GET) {
$sessionCacheFilters = $this->filterStore()->get($this->filterCacheKey);
return Arr::get($sessionCacheFilters, $filterName, $defaultChecked);
}
This will perform the same null check and the code will not be executed if the variable is null.
答案3
得分: 0
我认为这是最清晰的解决方案:
我向usesFilterCaching()
函数添加了以下文档块。
/**
* @phpstan-assert-if-true string $this->filterCacheKey
*/
protected function usesFilterCaching(): bool
{
return $this->filterCacheKey !== null;
}
如果该函数返回true,它会将$this->filterCacheKey
设置为字符串。
英文:
I think this is the cleanest solution:
I added the following docblock to the usesFilterCaching()
function.
/**
* @phpstan-assert-if-true string $this->filterCacheKey
*/
protected function usesFilterCaching(): bool
{
return $this->filterCacheKey !== null;
}
This sets $this->filterCacheKey
to a string if the function returns true.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论