【发布时间】:2021-06-03 19:41:36
【问题描述】:
考虑以下代码:
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class Car extends Model
{
public static function getTheFirstCar(string $color): ?self
{
/** @var ?self */ // <-- Doesn't apply! Is there any alternative?
return (new self())->newQuery()->firstWhere('color', '=', $color);
}
}
代码运行正常;尽管如此,PhpStorm 还是抱怨:
返回值应为'
Car|null',
'\Illuminate\Database\Eloquent\Builder|\Illuminate\Database\Eloquent\Model' 返回
将表达式的结果分配给带注释的变量可以解决警告,但会引入 “冗余” 变量!
/** @var ?self $redundant */
$redundant = (new self())->newQuery()->firstWhere('color', '=', $color);
return $redundant;
那么,PhpStorm 中是否有一种方法可以将 return 语句表达式的值显式地强制为 Car|null,而无需引入冗余变量或指定所有预期的返回类型?
【问题讨论】:
-
可以在方法上方加上
@return ?static|Model。问题本身看起来像this bug -
@Dmitrii 我不想通过添加与上下文无关的
Model类型来引入歧义(该方法只返回Car或null) -
你用的是什么phpstorm版本?
-
我使用的是 2020.3.2,它工作正常。也许你应该更新phpstorm。
-
@Dmitry 我也使用 PhpStorm v2020.3.2 (Build #PS-203.7148.74);请详细说明“什么”适合您? (是返回语句之前的
/** @var ?self */(这符合我的需要);或者,添加了与上下文无关的Model类型——我已经解释过了!)
标签: php laravel phpstorm phpdoc type-annotation