我的php版本是7.1.31,laravel版本是4.2。 我想要 phpstan 作为我的静态分析工具。 但是当我运行它时。它输出了很多错误。
例如:
示例代码
$results = MatchAction::join('users', 'matchactions.user_id', '=', 'users.id')
->select('users.name', 'users.email', 'matchactions.title')
->get();
这是我的示例配置文件:
parameters:
paths:
- application
level: 8
真正的问题是您正在使用 Laravel 4.2。在当前的 Laravel 版本(撰写本文时为 11.x)中,代码不会使 PHPStan 出错,因为 Eloquent Builder 实现了以下接口。
<?php
namespace Illuminate\Contracts\Database\Query;
/**
* This interface is intentionally empty and exists to improve IDE support.
*
* @mixin \Illuminate\Database\Query\Builder
*/
interface Builder
{
}
在 laravel 4.2 中,Eloquent Builder 没有实现接口,也没有扩展基础 Builder。
在 Eloquent Builder 中找不到的每个方法都会在定义的宏中查找,然后委托给基础 Builder(这是一个属性)
比较:
laravel 4.2's Eloquent Builder
<?php
namespace Illuminate\Database\Eloquent;
...
class Builder
{
/**
* The base query builder instance.
*
* @var \Illuminate\Database\Query\Builder
*/
protected $query;
...
/**
* Dynamically handle calls into the query instance.
*
* @param string $method
* @param array $parameters
* @return mixed
*/
public function __call($method, $parameters)
{
if (isset($this->macros[$method]))
{
array_unshift($parameters, $this);
return call_user_func_array($this->macros[$method], $parameters);
}
elseif (method_exists($this->model, $scope = 'scope'.ucfirst($method)))
{
return $this->callScope($scope, $parameters);
}
$result = call_user_func_array(array($this->query, $method), $parameters);
return in_array($method, $this->passthru) ? $result : $this;
}
...
}
laravel 11.x's Eloquent Builder
<?php
namespace Illuminate\Database\Eloquent;
...
use Illuminate\Contracts\Database\Eloquent\Builder as BuilderContract;
...
/**
* @template TModel of \Illuminate\Database\Eloquent\Model
*
* @property-read HigherOrderBuilderProxy $orWhere
* @property-read HigherOrderBuilderProxy $whereNot
* @property-read HigherOrderBuilderProxy $orWhereNot
*
* @mixin \Illuminate\Database\Query\Builder
*/
class Builder implements BuilderContract
{
...
/**
* The base query builder instance.
*
* @var \Illuminate\Database\Query\Builder
*/
protected $query;
...
}
事实上,它甚至再次添加了
@mixin
注释。
您可以做的一个快速而肮脏的修复是编辑供应商类以在/** * @mixin \Illuminate\Database\Query\Builder */
类之上添加
Illuminate\Database\Eloquent\Query\Builder
注释。当然,如果您更新依赖项并且 laravel 版本发生更改(或者您(重新)安装它们),则需要重新添加此行。应避免编辑供应商代码,但是
这是一个 phpdoc 块,没有实际功能。