首页 > 解决方案 > 当返回类型被错误推断时,如何防止 PhpStorm 中的错误警告?

问题描述

考虑以下代码:

<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Builder;
/**
 * Class MyModel
 * @package App\Models
 * @mixin Builder
 */
class MyModel extends Model
{
    public static function getGreens(): Builder
    {
        return (new self())->where('color', '=', 'green');
    }
}

return声明中,PhpStorm (2020.3) 抱怨说:

预期返回值'\Illuminate\Database\Eloquent\Builder''MyModel'返回

并建议:

将返回类型从 更改'\Illuminate\Database\Eloquent\Builder''MyModel'

这是非常不正确的(该where方法确实返回 的实例\Illuminate\Database\Eloquent\Builder,而 IDE 将返回类型推断为MyModel类型)。通过删除返回类型,IDE 会发出另一个警告:

缺少函数的返回类型声明

代码可以正常运行,但 IDE 不应报告任何错误警告!我应该如何避免在 PhpStorm 中出现这些警告?

PhpStorm (2020.3) 抱怨说:

标签: phplaravelphpstorm

解决方案


这是不遵循“最佳实践”的结果。的类层次结构MyModel不提供where;的方法 换句话说,这样的方法在类层次结构中不存在。但!的父类Model确实提供了一个魔术方法,当调用对象上下文中的不可访问的方法(在您的情况下是 的方法)__call()时,该方法会被触发。它本质上将“调用”转发到 的新实例,该实例具有所请求方法的实现(它是通过调用 的方法获得的)。这种机制不仅对 IDE 不友好,而且速度较慢where\Illuminate\Database\Eloquent\BuildernewQuery()

因此; 删除@mixin标签,而不是使用“魔术方法”,使用“本机访问”:

<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Builder;

class MyModel extends Model
{
    public static function getGreens(): Builder
    {
        return (new self())->newQuery()->where('color', '=', 'green');
        //                 ^^^^^^^^^^^^
    }
}

推荐阅读