考虑以下代码:
<?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中避免这些警告?

发布于 2021-01-18 10:33:49
这是不遵循“最佳实践”的结果。MyModel的类层次结构不提供where的方法;换句话说,在类层次结构中不存在这样的方法。但!Model的父类确实提供了一个魔术法 of __call(),当调用对象上下文中不可访问的方法(在您的例子中是where方法)时,会触发该方法。它本质上是将转发“呼叫”转换为一个新的\Illuminate\Database\Eloquent\Builder实例,该实例具有所请求的方法的实现(它是从调用newQuery()方法获得的)。这种机制不仅是IDE不友好的,而且也是慢点的.
因此,删除@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');
// ^^^^^^^^^^^^
}
}https://stackoverflow.com/questions/65551067
复制相似问题