首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当返回类型被错误推导时,如何防止PhpStorm中的错误警告?

当返回类型被错误推导时,如何防止PhpStorm中的错误警告?
EN

Stack Overflow用户
提问于 2021-01-03 14:43:04
回答 1查看 1.3K关注 0票数 4

考虑以下代码:

代码语言:javascript
复制
<?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中避免这些警告?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-01-18 10:33:49

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

因此,删除@mixin标记,而不是使用“神奇方法”,而是使用“本机访问”:

代码语言:javascript
复制
<?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');
        //                 ^^^^^^^^^^^^
    }
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65551067

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档