povils / phpmnd
用于检测代码库中魔数(Magic numbers)的工具
Requires
- php: ^7.4 || ^8.0
- composer-runtime-api: ^2.0
- nikic/php-parser: ^4.18 || ^5.0
- php-parallel-lint/php-console-highlighter: ^1.0
- phpunit/php-timer: ^2.0 || ^3.0 || ^4.0 || ^5.0 || ^6.0 || ^7.0
- symfony/console: ^4.4 || ^5.0 || ^6.0 || ^7.0
- symfony/finder: ^4.4 || ^5.0 || ^6.0 || ^7.0
Requires (Dev)
- phpunit/phpunit: ^9.6
- squizlabs/php_codesniffer: ^2.8.1||^3.5
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 povils/phpmnd
之后,您可以使用 vendor/bin/phpmnd
可执行文件调用它。
全局
要全局安装它,只需运行
$ composer global require povils/phpmnd
之后,请确保您已经将全局 Composer 二进制目录添加到您的 PATH
中。以下是一些 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
选项允许您扩展代码分析。提供的扩展必须是逗号分隔的。
--hint
选项将根据您的代码库常量建议魔数的替代方案。
--ignore-funcs
选项将在使用 "argument" 扩展时排除一个逗号分隔的函数列表,默认为 intval
、floatval
、strval
。
--ignore-numbers
选项将排除一个逗号分隔的数字列表,从代码分析中排除。
--ignore-strings
选项将在使用 "strings" 选项时排除字符串,从代码分析中排除。
--include-numeric-string
选项将强制将数字字符串(如 "1234")也视为数字。
--progress
选项将显示进度条。
--strings
选项将包括字符串字面量搜索在代码分析中。
--suffixes
选项将配置逗号分隔的有效源代码文件扩展名列表。
--whitelist
选项将仅处理指定文件中的文件。这对于增量分析很有用。
--xml-output
选项将生成报告,格式为 XML,路径由选项指定。默认情况下,它分析条件、返回语句和 switch 情况。
扩展
- argument
round($number, 4);
- array
$array = [200, 201];
- assign
$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为非魔法数字。
贡献
请参阅CONTRIBUTING.md以获取更多信息。
许可
MIT许可(MIT)。请参阅LICENSE以获取更多信息。