php - 当返回类型被错误推断时,如何防止 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 中出现这些警告?
解决方案
这是不遵循“最佳实践”的结果。的类层次结构MyModel
不提供where
;的方法 换句话说,这样的方法在类层次结构中不存在。但!的父类Model
确实提供了一个魔术方法,当调用对象上下文中的不可访问的方法(在您的情况下是 的方法)__call()
时,该方法会被触发。它本质上将“调用”转发到 的新实例,该实例具有所请求方法的实现(它是通过调用 的方法获得的)。这种机制不仅对 IDE 不友好,而且速度较慢。where
\Illuminate\Database\Eloquent\Builder
newQuery()
因此; 删除@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');
// ^^^^^^^^^^^^
}
}
推荐阅读
- android - 反应本机反应导航安全区域问题
- google-docs - 基于用户启用的下拉选项
- linq - 在 EF Core/LINQ 中查询多对多表
- javascript - 单击提交按钮后,反应表单未在屏幕上显示正确的输入
- apache-flink - 如何在 HDFS 中以 parquet 文件格式写入实时数据流 flink 数据
- ios - UIKit UIViewController viewDidLoad完成时如何在SwiftUI中获得通知
- javascript - 如何将叠加层添加到材质 UI 表格行?
- django - PostgreSQL 命令在 virtualenv 中不起作用
- flutter - 导航到新页面时防止颤动块状态更改
- java - 使用会话将数据从 Servlet 发送到 JSP 导致 null