如何让phpstan查找自定义扩展类?

问题描述

要实现对某些神奇的_get()函数的检查,我正在尝试实现“类反射扩展”。 The manual提到了如何自己编写扩展文件以及如何通过在霓虹灯文件添加service部分来安装扩展文件

我写了一个扩展名,并像这样添加它:

services:
    -
        class: TestClass
        tags:
            - PHPstan.broker.methodsClassReflectionExtension

这将导致以下错误

服务'0226':找不到类TestClass。

我尝试过的事情:

  • 使用独立的phar
  • 使用PHPstan的作曲家安装
  • 使用特定的命名空间(PHPStan)进行扩展(在文件和霓虹灯中)
  • 使用“随机名称空间(在文件和霓虹灯中)
  • 文件添加到我正在扫描的目录中进行分析
  • 将带有扩展名的目录添加到“ scanDirectories”参数中
  • 文件添加到“ scanFiles”参数
  • 将带有扩展名的目录添加到“ paths”参数
  • 添加(不建议使用的)自动加载指令并将文件添加到此处。

其中一些“添加”尝试实际上会警告是否找不到文件:例如,如果我故意在其中一种打错字,比如说自动加载一个,它会警告我文件丢失。但前提是我没有定义service

如果我定义了服务并在其中输入了故意的拼写错误,它会在未找到的类(而不是拼写错误)上方返回,所以我觉得它正在检查任何参数之前的扩展名?

似乎有必要将我的文件添加到其他自动加载机制中。问题是,哪个以及如何?

我正在使用

解决方法

扩展类需要在运行时加载。您可以通过两种方式实现这一目标:

  1. 使该类可用于Composer自动加载器。通常只需配置composer.json的autoload-dev部分即可。

  2. 创建一个名为phpstan-autoload.php的文件,在其中require_once带有扩展名类的文件。运行PHPStan时,在命令行上以--autoload-file|-a选项的形式将路径传递到phpstan-autoload.php文件。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...