phpmnd / phpmnd
检测代码库中魔法数字的工具
Requires
- php: ^7.1 || ^8.0
- nikic/php-parser: ^4.0
- php-parallel-lint/php-console-highlighter: ^0.4
- phpunit/php-timer: ^2.0 || ^3.0 || ^4.0 || ^5.0
- symfony/console: ^4.0 || ^5.0
- symfony/finder: ^4.0 || ^5.0
Requires (Dev)
- phpunit/phpunit: ^7.0 || ^8.0 || ^9.0
- squizlabs/php_codesniffer: ^2.8.1 || ^3.5
This package is auto-updated.
Last update: 2023-11-18 23:40:10 UTC
README
phpmnd
是一个旨在 帮助 您检测 PHP 代码中的魔法数字的工具。默认情况下,0 和 1 不被认为是魔法数字。
什么是魔法数字?
魔法数字是一个未定义为常量的数字字面量,但可能在以后某个阶段发生变化,因此可能难以更新。在源代码中直接使用数字而不加解释被认为是一种不良的编程实践。在大多数情况下,这会使程序更难阅读、理解和维护。
考虑以下假设的代码
class Foo { public function setPassword($password) { // don't do this if (mb_strlen($password) > 7) { throw new InvalidArgumentException("password"); } } }
应该重构为
class Foo { const MAX_PASSWORD_LENGTH = 7; // not const SEVEN = 7 :) public function setPassword($password) { if (mb_strlen($password) > self::MAX_PASSWORD_LENGTH) { throw new InvalidArgumentException("password"); } } }
这明显提高了代码的可读性,并减少了维护成本。
当然,不是每个字面数字都是魔法数字。
$is_even = $number % 2 === 0
在这种情况下,数字 2 显然不是魔法数字。
我的经验法则
If the number came from business specs and is used directly - it's a magic number.
安装
本地安装
您可以通过使用 Composer 将此工具添加为本地、按项目、开发依赖项。
$ composer require --dev phpmnd/phpmnd
之后,您可以使用 vendor/bin/phpmnd
可执行文件调用它。
全局安装
要全局安装,只需运行
$ composer global require phpmnd/phpmnd
之后,请确保您的 PATH
中有全局 Composer 二进制目录。例如,某些 Unix 系统的示例
$ export PATH="$PATH:$HOME/.composer/vendor/bin"
使用示例
基本用法
$ phpmnd wordpress --ignore-numbers=2,-1 --ignore-funcs=round,sleep --exclude=tests --progress \ --extensions=default_parameter,-return,argument
--allow-array-mapping
选项在 "array" 扩展中使用时允许键为字符串。
--exclude-file
选项将排除文件从代码分析中。允许多个值。
--exclude-path
选项将排除路径,该路径必须是相对于源代码的,从代码分析中排除。允许多个值。
--exclude
选项将排除目录,该目录必须是相对于源代码的,从代码分析中排除。允许多个值(例如,--exclude=tests --exclude=examples)。
--extensions
选项允许您扩展代码分析。提供的扩展必须用逗号分隔。
--ignore-funcs
选项将在使用 "argument" 扩展时排除逗号分隔的函数列表。默认为 intval
、floatval
、strval
。
--ignore-numbers
选项将排除逗号分隔的数字列表,从代码分析中排除。
--ignore-strings
选项将在使用 "strings" 选项时排除字符串。
--include-numeric-string
选项将强制将数字字符串(如 "1234")也视为数字。
--progress
选项将显示进度条。
--strings
选项将包括代码分析中的字符串字面量搜索。
--suffixes
选项将配置逗号分隔的有效源代码文件名扩展列表。
--whitelist
选项将只处理指定文件中列出的文件。这对于增量分析很有用。
使用--xml-output
选项将在指定路径生成一个XML格式的报告。默认情况下,它分析条件、返回语句和switch case。
从可用扩展列表中选择
- 参数
round($number, 4);
- 数组
$array = [200, 201];
- 赋值
$var = 10;
- 默认参数
function foo($default = 3);
- 操作
$bar = $foo * 20;
- 属性
private $bar = 10;
- 返回(默认)
return 5;
- 条件(默认)
$var < 7;
- switch_case(默认)
case 3;
- 所有 包括所有扩展。
如果扩展以减号开头,则表示这些扩展将从代码分析中移除。在使用这些扩展之前,建议您先使用默认扩展来清理代码。
忽略分析中的数字
有时需要使用魔法数字。例如,通过实现已知的数学公式,默认情况下,intval
、floatval
和strval
会将数字标记为非魔法。
例如
$percent = $number / 100;
将显示100为魔法数字
$percent = $number / intval(100);
将标记100为非魔法数字。
贡献
请考虑阅读我们的简短贡献指南。
许可
MIT许可(MIT)。有关更多信息,请参阅LICENSE。