PhpStorm:有没有办法使用内联PHPDoc注释在return语句上强制执行类型?
考虑以下代码:
<?php
namespace AppModels;
use IlluminateDatabaseEloquentModel;
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”,返回
“IlluminateDatabaseEloquentBuilder|IlluminateDatabaseEloquentModel”
将表达式的结果赋值给一个带注释的变量可以解决警告,但会引入一个“冗余”变量!
/** @var ?self $redundant */
$redundant = (new self())->newQuery()->firstWhere('color', '=', $color);
return $redundant;
那么,在 PhpStorm 中是否有一种方法可以return明确地为语句表达式的值强制执行内联类型注释Car|null,而不引入冗余变量或指定所有预期的返回类型?
回答
您可以通过@noinspection PhpIncompatibleReturnTypeInspection在语句之前添加注释来抑制此警告。
我个人不会这样做,但这是您关于如何“强制”返回类型并抑制警告 afaik 的问题的唯一答案。
/** @noinspection PhpIncompatibleReturnTypeInspection */
return (new self())->newQuery()->where('color', '=', $color)->first();
如果您决定尊重警告,那么这可能是它的原因和解决方案:
newQuery()将在模型表上创建一个新查询(最有可能的是:)cars而不设置适当的模型(Car)。
在内部,您现在正在对cars. 因此,您将收到适当的记录,但不会是 的实例Car,而是 的实例Model。因此,PhpStorm 期望这里有多个额外的返回类型,并在您的语句上打印此警告,因为它与方法返回类型不同?self。
快速解决方案是更改newQuery()为newModelQuery(). 这将创建一个新查询并Car在创建的查询上设置模型并返回适当的实例或 null
<?php
namespace AppModels;
use IlluminateDatabaseEloquentModel;
class Car extends Model
{
public static function getTheFirstCar(string $color): ?self
{
return (new self())->newModelQuery()->firstWhere('color', '=', $color);
// I'd use this statement though:
// return self::where('color', '=', $color)->first();
}
}
THE END
二维码