标签: phpstan

如何配置 PHPStan 以避免由特定类和/或魔术方法引起的误报?

在项目中使用 PHP RedBean 时,PHPStan 报告如下问题:

87     Access to an undefined property RedBeanPHP\OODBBean::$token.
Run Code Online (Sandbox Code Playgroud)

发生这种情况是因为 RedBean 的 OODBBean 类使用魔术方法将类属性与数据库表列进行逻辑绑定。AFAIK,RedBean 实现该功能的方式没有任何问题。

有没有办法配置 PHPStan 以忽略来自 RedBean(或任何其他类)的问题?或者忽略魔术方法可能导致的问题?

php redbean phpstan

5
推荐指数
1
解决办法
2204
查看次数

PHPStan,排除所有并指定要检查的文件

我试图在旧的、更大的代码库上设置 PHPStan。我怎么能排除一切,而不是通过配置定义要分析的内容。

我曾考虑为它使用一个单独的文件夹,但这意味着不断移动可能导致代码破坏的文件。所以我希望排除所有内容,然后将文件添加到每个文件的分析器中。

目前我能找到的唯一解决方案是在 composer.json

  "scripts": {
    "phpstan": "./vendor/bin/phpstan analyse --memory-limit=1G --no-progress --level 1 `cat phpstan_analyse_files`"
  }
Run Code Online (Sandbox Code Playgroud)

并在文件中保留要分析的文件列表 phpstan_analyse_files

phpstan

4
推荐指数
1
解决办法
6938
查看次数

phpstan抱怨使用Flex项目在Symfony 3.4中进行Doctrine Migrations

我有一个基于Symfony 3.4和Flex的项目,我已经添加了phpstan进行静态分析.

它抱怨没有找到我的迁移课程:

Class DoctrineMigrations\Version20180831185050 was not found while trying to analyse it - autoloading is probably not configured properly.

实际上,Doctrine Migrations生成的文件不适合自动加载器模式,但工作正常.

有什么办法可以阻止抱怨吗?

symfony doctrine-migrations phpstan symfony-flex

4
推荐指数
2
解决办法
895
查看次数

PHPStan 不使用自定义实体存储库

我正在使用 PHPStan 及其 Doctrine 扩展。

我有一个使用 doc 块调用的自定义实体存储App\Repository\Doctrine\UserRepository@extends

/**
 * @extends \Doctrine\ORM\EntityRepository<\App\Entity\User>
 */
class UserRepository extends EntityRepository implements IUserRepository
{
    public function customRepositoryMethod()
    {
        // ...
    }
}
Run Code Online (Sandbox Code Playgroud)

在控制器中,这段代码:

    public function getUserMatches(EntityManager $em)
    {
        $userRepo = $em->getRepository(\App\Entity\User::class);
        $userRepo->customRepositoryMethod();
    }
Run Code Online (Sandbox Code Playgroud)

...导致此 PHPStan 错误:

Call to an undefined method Doctrine\ORM\EntityRepository<meQ\Entity\User>::customRepositoryMethod().
Run Code Online (Sandbox Code Playgroud)

感谢 phpstan-doctrine,静态分析知道$em->getRepository(User::class)返回一个EntityRepository<User>.

但是,它不知道将自定义存储库类UserRepository视为该泛型类型的实现。

如何 DocBlock UserRepository 类,或以其他方式配置 PHPStan,以便它解释UserRepository为 的实现EntityRepository<User>

我还尝试过什么

我也尝试过这个 DocBlock,但UserRepository没有成功:

Call to an undefined …
Run Code Online (Sandbox Code Playgroud)

php doctrine static-analysis symfony phpstan

4
推荐指数
1
解决办法
1914
查看次数

phpstan:如何处理派生类返回类型

phpstan修复此示例代码生成的错误的正确方法是什么?错误信息是:

Method Foo::foo() should return Child but returns Base.

<?php declare(strict_types = 1);

Interface MyI {abstract function a(): self;}
Class Base implements MyI { 
    public function a(): self {return $this;} 
}
Class Child extends Base { 
    public function c(): self {return $this;} 
}
Class Foo {
public function factory(): Child {return new Child();}
/**
 * @return Child
 */
public function foo() /* note no return type */  {
    return $this->factory()
        ->c()
        ->a();
}
Run Code Online (Sandbox Code Playgroud)

}

消除错误的一种方法是将其更改为@return

/**
 * …
Run Code Online (Sandbox Code Playgroud)

php phpstan

3
推荐指数
1
解决办法
5217
查看次数

如何让 phpstan 推断我的 Laravel Collection 管道的类型?

鉴于我的班级

<?php
declare(strict_types=1);

use Illuminate\Support\Collection;
use stdClass;

class PhpstanIssue
{
    /**
     * @param Collection<Collection<stdClass>> $collection
     *
     * @return Collection<Foo>
     */
    public function whyDoesThisFail(Collection $collection): Collection
    {
        return $collection
            ->flatten() // Collection<stdClass>
            ->map(static function (\stdClass $std): ?Foo {
                return Foo::get($std);
            }) // should now be Collection<?Foo>
            ->filter(); // should now be Collection<Foo>
    }
}
Run Code Online (Sandbox Code Playgroud)

我非常困惑为什么 phpstan (0.12.64) 会失败:

18: [ERROR] Method PhpstanIssue::whyDoesThisFail() should return
Illuminate\Support\Collection&iterable<Foo> but returns 
Illuminate\Support\Collection&iterable<Illuminate\Support\Collection&iterable<stdClass>>. (phpstan)
Run Code Online (Sandbox Code Playgroud)

为什么 phpstan 无法推断出该管道的正确结果类型?如何让 phpstan 理解管道?


我可以验证我的代码在 phpunit 测试用例中是否有效:

class MyCodeWorks extends TestCase …
Run Code Online (Sandbox Code Playgroud)

php laravel illuminate-container phpstan

3
推荐指数
1
解决办法
5189
查看次数

为什么在尝试将 Carbon 转换为 DateTime 时出现错误?

我正在开发一个 Laravel 项目。我尝试使用 Carbon 创建一个 DateTime 对象。这是我尝试过的:

Carbon::createFromFormat('Y-m-d H:i:s', '2021-10-01T00:01:00')->toDateTime();
Run Code Online (Sandbox Code Playgroud)

但我的 phpstan 抱怨:Cannot call method toDateTime() on Carbon\Carbon|false.

为什么会出现这个错误呢?Carbon转换为对象的正确方法是什么DateTime

php laravel php-carbon phpstan

2
推荐指数
1
解决办法
5757
查看次数

使用 phpdocblock 定义 php 中方法/函数的通用返回

有没有一种方法可以指定函数将返回特定类型的对象,其中类型是参数之一的字符串?

例如

/**
 * @return object<$class>
 */
public function create(string $class): object {
 ... some factory stuff
}

Run Code Online (Sandbox Code Playgroud)

这样 vscode 或 phpstorm 就会知道当我这样做时

$myvar = X::create('MyClass');
Run Code Online (Sandbox Code Playgroud)

$myvar 将是 MyClass 类型,我将拥有适当的智能感知/自动完成功能?

php visual-studio-code phpstan psalm-php

1
推荐指数
1
解决办法
1706
查看次数