在项目中使用 PHP RedBean 时,PHPStan 报告如下问题:
87 Access to an undefined property RedBeanPHP\OODBBean::$token.
Run Code Online (Sandbox Code Playgroud)
发生这种情况是因为 RedBean 的 OODBBean 类使用魔术方法将类属性与数据库表列进行逻辑绑定。AFAIK,RedBean 实现该功能的方式没有任何问题。
有没有办法配置 PHPStan 以忽略来自 RedBean(或任何其他类)的问题?或者忽略魔术方法可能导致的问题?
我试图在旧的、更大的代码库上设置 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
我有一个基于Symfony 3.4和Flex的项目,我已经添加了phpstan进行静态分析.
它抱怨没有找到我的迁移课程:
Class DoctrineMigrations\Version20180831185050 was not found while trying to analyse it - autoloading is probably not configured properly.
实际上,Doctrine Migrations生成的文件不适合自动加载器模式,但工作正常.
有什么办法可以阻止抱怨吗?
我正在使用 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) 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
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) 我正在开发一个 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?
有没有一种方法可以指定函数将返回特定类型的对象,其中类型是参数之一的字符串?
例如
/**
* @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 类型,我将拥有适当的智能感知/自动完成功能?
phpstan ×8
php ×6
laravel ×2
symfony ×2
doctrine ×1
php-carbon ×1
psalm-php ×1
redbean ×1
symfony-flex ×1