phpstan/phpstan-strict-rules

PHPStan 的额外严格和有意见的规则

安装次数: 33,575,030

依赖: 3,134

建议者: 4

安全性: 0

星标: 597

关注者: 19

分支: 46

开放问题: 40

类型:phpstan-extension

1.6.1 2024-09-20 14:04 UTC

README

Build Latest Stable Version License

PHPStan 关注于找到代码中的错误。但在 PHP 中,有很多关于如何编写代码的自由度。这个存储库包含了一些额外的规则,围绕严格和强类型代码,没有松散类型转换,为那些希望在极端防御性编程中获得额外安全性的开发者。

  • ifelseif、三元运算符、! 之后,以及 &&|| 的两侧要求布尔值。
  • + 中要求数字操作数或数组,在 -/*///**/% 中要求数字操作数。
  • $var++$var--++$var--$var 中要求数字操作数。
  • 这些函数包含一个 $strict 参数以提高类型安全性,它必须设置为 true
    • in_array(第三个参数)
    • array_search(第三个参数)
    • array_keys(第三个参数;只有当第二个参数 $search_value 提供时)
    • base64_decode(第二个参数)
  • while 循环条件中和 for 循环初始赋值中分配的变量在循环之后不能使用。
  • 在 foreach 中设置,由于非空数组而始终循环的变量在循环之后不能使用。
  • switch 条件和 case 值中的类型必须匹配。PHP 默认会松散地比较它们,这可能导致意外的结果。
  • 检查静态声明的方法是否以静态方式调用。
  • 禁止使用 empty() - 这是一个非常松散的比较(参见 手册),建议使用更严格的版本。
  • 禁止使用短三元运算符(?:) - 表示弱比较,建议使用空合并运算符(??)或具有严格条件的三元运算符。
  • 禁止使用变量变量(如 $$foo$this->method() 等)
  • 禁止使用 foreach 键和值变量覆盖变量
  • 始终为 instanceof、类型检查 is_* 函数和严格比较 ===/!==。可以通过将 checkAlwaysTrueInstanceof/checkAlwaysTrueCheckTypeFunctionCall/checkAlwaysTrueStrictComparison 设置为 false 来关闭这些检查。
  • 正确引用和调用的函数名称的案例。
  • 正确引用和实现的方法名称的案例。
  • 在继承方法中参数类型为逆变,返回类型为协变(也称为 Liskov 替换原则 - LSP)
  • 甚至对于静态方法也要检查 LSP
  • 要求调用父构造函数
  • 禁止使用反引号运算符(如 $ls = `ls -la`
  • 闭包应该直接使用 $this 而不是间接使用 $this 变量

后续版本中还将推出更多规则!

安装

要使用此扩展,请在 Composer 中包含它

composer require --dev phpstan/phpstan-strict-rules

如果您还安装了 phpstan/extension-installer,则已设置完毕!

手动安装

如果您不想使用 phpstan/extension-installer,请将 rules.neon 包含在您的项目 PHPStan 配置中

includes:
    - vendor/phpstan/phpstan-strict-rules/rules.neon

禁用规则

您可以使用配置参数禁用规则

parameters:
	strictRules:
		disallowedLooseComparison: false
		booleansInConditions: false
		uselessCast: false
		requireParentConstructorCall: false
		disallowedConstructs: false
		overwriteVariablesWithLoop: false
		closureUsesThis: false
		matchingInheritedMethodNames: false
		numericOperandsInArithmeticOperators: false
		strictCalls: false
		switchConditionsMatchingType: false
		noVariableVariables: false
		strictArrayFilter: false

除了引入新的自定义规则外,phpstan-strict-rules 还可以更改 PHPStan 本身中存在的某些配置参数的默认值。这些参数在 phpstan.org 上有文档说明。[链接](https://phpstan.org/config-reference#stricter-analysis)

逐个启用规则

如果您不想一次性使用所有可用的严格规则,只想使用一个或两个,您也可以做到!

您可以使用以下命令禁用包含的 rules.neon 中的所有规则:

parameters:
	strictRules:
		allRules: false

然后,您可以使用配置参数逐个重新启用规则

parameters:
	strictRules:
		allRules: false
		booleansInConditions: true

即使将 strictRules.allRules 设置为 false,此包的部分功能仍然有效。这是因为 phpstan-strict-rules 也更改了 PHPStan 本身中存在的某些配置参数的默认值。这些参数在 phpstan.org 上有文档说明。[链接](https://phpstan.org/config-reference#stricter-analysis)