hostnet / type-inference-tool
推断参数和返回类型并将它们声明为返回类型声明和类型提示的工具。
Requires
- php: >=7.1
- bramus/monolog-colored-line-formatter: ^2.0
- doctrine/dbal: ^2.5
- gossi/docblock: ^1.5
- monolog/monolog: ^1.22
- nikic/php-parser: ^3.0
- sebastian/diff: ^3.0
- symfony/console: ^3.2
- symfony/filesystem: ^3.2
- symfony/finder: ^3.2
- symfony/stopwatch: ^3.2
Requires (Dev)
- hostnet/database-test-lib: ^1.0.5
- hostnet/phpcs-tool: ^6.0.2
- phpunit/phpunit: ^7.0.0
This package is auto-updated.
Last update: 2020-12-20 13:31:47 UTC
README
废弃
此包已被废弃。请使用替代工具,如
类型推断工具
从PHP 7.0开始,可以添加 标量类型提示 和 返回类型声明。类型推断工具是为了通过执行一个命令将这些类型提示添加到PHP应用程序而创建的。
类型推断工具通过使用动态和静态分析为PHP项目添加参数和返回类型提示。动态分析是通过分析在目标项目及其PHPUnit测试(运行时)执行期间生成的跟踪来完成的。静态分析是通过解析目标项目的PHP代码到抽象语法树并分析它们来完成的。静态和动态分析器收集的数据被组合并用于推断参数和函数类型。
先决条件
- XDebug必须已安装
- 需要PHP 7.1+
- 目标项目必须具有正常工作的PHPUnit测试(非失败/不会引发错误)
- 目标项目的Composer依赖项必须已安装
安装
克隆 hostnet/type-inference-tool
并使用Composer安装依赖项。
用法
类型推断工具通过执行命令使用。本节解释了该命令的可用选项。
基本命令
要执行的最基本的命令如下
./application.php execute <target project directory>
选项
可以在基本命令旁边设置某些选项。以下是一些选项
--log-file=<path>
:指定要写入日志的文件。可以通过尾随日志文件来跟踪执行进度。无法将类型提示添加到参数或函数的情况也会被记录。--storage-type=<mem|file|db>
:动态分析器在分析期间使用 XDebug跟踪文件。解析这些跟踪可能会占用大量空间,具体取决于目标项目的大小。为了防止工具耗尽内存,提供了三种存储方法:mem
(默认)、file
和db
。mem
将使用内部内存来保存解析数据。这通常是最快的方法,但不推荐在大型项目上运行工具。file
将解析数据存储到外部文件,这会导致更少的内存使用,但执行时间会更长。db
与file
类似,但会将数据存储到数据库中。在大型项目上运行工具时,建议使用db
。请注意,当使用db
时,必须提供以下选项--db-config
。--db-config=<db-config.json>
:当使用--storage-type=db
时,必须提供此选项。使用此选项可设置数据库配置。有关此类配置文件的格式,请参阅/database/config.json.dist。请确保您的数据库结构与DDL.sql中定义的结构相同。--ignore-folders=<folder1,folder2,etc>
:设置要忽略的文件夹。忽略文件夹中的文件将不会收到类型提示。供应商文件夹始终被忽略。此选项特别有用,可以排除生成文件被更改。--trace=<existing_trace.xt>
:如果您已经为您目标项目有了XDebug跟踪文件,您可以在动态分析期间提供该跟踪文件。这对大型项目来说很有利,因为生成XDebug跟踪文件可能会花费相当多的时间和空间。--show-diff
:当启用时,类型推断工具将在控制台上输出对目标项目所做的所有更改(diff)。--analyse-only
:启用此选项后,类型推断工具不会修改给定的目标项目。这对于与--show-diff
选项组合使用的小型项目来检查将要添加的类型提示很有用。--help
:显示帮助。列出所有可用选项的简短描述。
示例
本节提供了一些执行命令示例。这些示例根据目标项目的三种类型进行分类:小型、大型和巨型。由于这些术语相当主观,您需要自行判断您的目标项目是小型、大型还是巨型。
小型项目
当在“小型”项目上执行工具时,建议使用以下命令。使用此命令将使用内存中的数据存储。
./application.php execute /home/user/projects/my-project --log-file=/home/user/projects/logs/mylogs.log --ignore-folders=Generated,cache,test
大型项目
当在“大型”项目上执行项目时,建议使用文件存储类型。当在“大型”或“巨型”项目上执行工具时,仔细设置您的--ignore-folders
将有利于减少工具的执行时间。
./application.php execute /home/user/projects/my-project --log-file=/home/user/projects/logs/mylogs.log --storage-type=file --ignore-folders=Generated,cache,test
巨型项目
当在巨型项目上执行工具时,建议使用数据库存储类型。重要的是您的数据库配置(--db-config
)是正确的,并且您的数据库已经具有有效的表(数据库定义在DDL.sql中提供)。请注意,在“巨型”项目上执行工具可能需要超过一小时的时间(取决于目标项目的大小)。提供现有的XDebug跟踪文件可以减少执行时间。如果没有提供跟踪文件,类型推断工具将生成一个新的跟踪文件。之后将删除新生成的跟踪文件。
./application.php execute /home/user/projects/my-project --log-file=/home/user/projects/logs/mylogs.log --storage-type=db --db-config=/home/user/database-config.json --ignore-folders=Generated,cache,test
执行后
类型推断工具不能保证结果目标项目完全正确。请确保您验证目标项目的状态。这可以通过执行PHPUnit并检查是否没有失败或错误来完成。
类型推断工具不会向项目文件添加use语句,在添加类型提示后,您可能需要自己添加use语句。
类型推断工具可能会违反您的PHP编码风格/约定。请确保您手动检查或使用PHP代码检查器进行检查。工具可能引起的违规之一是某些代码行在添加类型提示后超过了每行的最大字符数。
改进
类型推断工具目前有以下限制
- 工具不检查PHP 7.2协变