From 913f6e781cc870364ed36d5f6c7355362048f13b Mon Sep 17 00:00:00 2001 From: Vincent Langlet Date: Sat, 24 May 2025 13:44:05 +0200 Subject: [PATCH 1/5] Introduce reportCastedArrayKey parameter --- conf/config.neon | 1 + conf/parametersSchema.neon | 1 + src/Rules/Arrays/AllowedArrayKeysTypes.php | 17 +++++---- .../Arrays/InvalidKeyInArrayDimFetchRule.php | 4 ++- .../Arrays/InvalidKeyInArrayItemRule.php | 5 ++- .../InvalidKeyInArrayDimFetchRuleTest.php | 19 ++++++++++ .../Arrays/InvalidKeyInArrayItemRuleTest.php | 35 +++++++++++++++++++ .../Arrays/data/invalid-key-array-item.php | 4 +++ .../Rules/Arrays/data/unset-false-key.php | 16 +++++++++ 9 files changed, 93 insertions(+), 9 deletions(-) create mode 100644 tests/PHPStan/Rules/Arrays/data/unset-false-key.php diff --git a/conf/config.neon b/conf/config.neon index 751c0507a4..3e57582d9e 100644 --- a/conf/config.neon +++ b/conf/config.neon @@ -80,6 +80,7 @@ parameters: reportStaticMethodSignatures: false reportWrongPhpDocTypeInVarTag: false reportAnyTypeWideningInVarTag: false + reportArrayKeyCast: false reportPossiblyNonexistentGeneralArrayOffset: false reportPossiblyNonexistentConstantArrayOffset: false checkMissingOverrideMethodAttribute: false diff --git a/conf/parametersSchema.neon b/conf/parametersSchema.neon index 55df0639fb..57016c487f 100644 --- a/conf/parametersSchema.neon +++ b/conf/parametersSchema.neon @@ -88,6 +88,7 @@ parametersSchema: reportStaticMethodSignatures: bool() reportWrongPhpDocTypeInVarTag: bool() reportAnyTypeWideningInVarTag: bool() + reportArrayKeyCast: bool() reportPossiblyNonexistentGeneralArrayOffset: bool() reportPossiblyNonexistentConstantArrayOffset: bool() checkMissingOverrideMethodAttribute: bool() diff --git a/src/Rules/Arrays/AllowedArrayKeysTypes.php b/src/Rules/Arrays/AllowedArrayKeysTypes.php index b670dbb891..5ff38b7453 100644 --- a/src/Rules/Arrays/AllowedArrayKeysTypes.php +++ b/src/Rules/Arrays/AllowedArrayKeysTypes.php @@ -22,19 +22,22 @@ final class AllowedArrayKeysTypes { - public static function getType(?PhpVersion $phpVersion = null): Type + public static function getType(?PhpVersion $phpVersion = null, bool $strict = false): Type { $types = [ new IntegerType(), new StringType(), - new BooleanType(), ]; - if ($phpVersion === null || !$phpVersion->deprecatesImplicitlyFloatConversionToInt()) { - $types[] = new FloatType(); - } - if ($phpVersion === null || !$phpVersion->deprecatesNullArrayOffset()) { - $types[] = new NullType(); + if (!$strict) { + $types[] = new BooleanType(); + + if ($phpVersion === null || !$phpVersion->deprecatesImplicitlyFloatConversionToInt()) { + $types[] = new FloatType(); + } + if ($phpVersion === null || !$phpVersion->deprecatesNullArrayOffset()) { + $types[] = new NullType(); + } } return new UnionType($types); diff --git a/src/Rules/Arrays/InvalidKeyInArrayDimFetchRule.php b/src/Rules/Arrays/InvalidKeyInArrayDimFetchRule.php index 0723234b36..ddd7963e92 100644 --- a/src/Rules/Arrays/InvalidKeyInArrayDimFetchRule.php +++ b/src/Rules/Arrays/InvalidKeyInArrayDimFetchRule.php @@ -27,6 +27,8 @@ public function __construct( private PhpVersion $phpVersion, #[AutowiredParameter] private bool $reportMaybes, + #[AutowiredParameter] + private bool $reportArrayKeyCast, ) { } @@ -58,7 +60,7 @@ public function processNode(Node $node, Scope $scope): array return []; } - $allowedArrayKeys = AllowedArrayKeysTypes::getType($this->phpVersion); + $allowedArrayKeys = AllowedArrayKeysTypes::getType($this->phpVersion, $this->reportArrayKeyCast); $dimensionType = $this->ruleLevelHelper->findTypeToCheck( $scope, $node->dim, diff --git a/src/Rules/Arrays/InvalidKeyInArrayItemRule.php b/src/Rules/Arrays/InvalidKeyInArrayItemRule.php index 298c65b565..3b875a6703 100644 --- a/src/Rules/Arrays/InvalidKeyInArrayItemRule.php +++ b/src/Rules/Arrays/InvalidKeyInArrayItemRule.php @@ -4,6 +4,7 @@ use PhpParser\Node; use PHPStan\Analyser\Scope; +use PHPStan\DependencyInjection\AutowiredParameter; use PHPStan\DependencyInjection\RegisteredRule; use PHPStan\Php\PhpVersion; use PHPStan\Rules\Rule; @@ -24,6 +25,8 @@ final class InvalidKeyInArrayItemRule implements Rule public function __construct( private RuleLevelHelper $ruleLevelHelper, private PhpVersion $phpVersion, + #[AutowiredParameter] + private bool $reportArrayKeyCast, ) { } @@ -39,7 +42,7 @@ public function processNode(Node $node, Scope $scope): array return []; } - $allowedArrayKeys = AllowedArrayKeysTypes::getType($this->phpVersion); + $allowedArrayKeys = AllowedArrayKeysTypes::getType($this->phpVersion, $this->reportArrayKeyCast); $dimensionType = $this->ruleLevelHelper->findTypeToCheck( $scope, $node->key, diff --git a/tests/PHPStan/Rules/Arrays/InvalidKeyInArrayDimFetchRuleTest.php b/tests/PHPStan/Rules/Arrays/InvalidKeyInArrayDimFetchRuleTest.php index 38baa0026d..d63cc0eb32 100644 --- a/tests/PHPStan/Rules/Arrays/InvalidKeyInArrayDimFetchRuleTest.php +++ b/tests/PHPStan/Rules/Arrays/InvalidKeyInArrayDimFetchRuleTest.php @@ -15,6 +15,8 @@ class InvalidKeyInArrayDimFetchRuleTest extends RuleTestCase { + private bool $reportCastedArrayKey = false; + protected function getRule(): Rule { $ruleLevelHelper = new RuleLevelHelper(self::createReflectionProvider(), true, false, true, true, true, false, true); @@ -22,6 +24,7 @@ protected function getRule(): Rule $ruleLevelHelper, self::getContainer()->getByType(PhpVersion::class), true, + $this->reportCastedArrayKey, ); } @@ -163,4 +166,20 @@ public function testBug12981(): void ]); } + public function testUnsetFalseKey(): void + { + $this->reportCastedArrayKey = true; + + $this->analyse([__DIR__ . '/data/unset-false-key.php'], [ + [ + 'Invalid array key type false.', + 6, + ], + [ + 'Invalid array key type false.', + 13, + ], + ]); + } + } diff --git a/tests/PHPStan/Rules/Arrays/InvalidKeyInArrayItemRuleTest.php b/tests/PHPStan/Rules/Arrays/InvalidKeyInArrayItemRuleTest.php index 1c01cf62ca..efa5df3e7b 100644 --- a/tests/PHPStan/Rules/Arrays/InvalidKeyInArrayItemRuleTest.php +++ b/tests/PHPStan/Rules/Arrays/InvalidKeyInArrayItemRuleTest.php @@ -15,6 +15,8 @@ class InvalidKeyInArrayItemRuleTest extends RuleTestCase { + private bool $reportCastedArrayKey = false; + private bool $checkExplicitMixed = false; private bool $checkImplicitMixed = false; @@ -26,6 +28,7 @@ protected function getRule(): Rule return new InvalidKeyInArrayItemRule( $ruleLevelHelper, self::getContainer()->getByType(PhpVersion::class), + $this->reportCastedArrayKey, ); } @@ -102,6 +105,38 @@ public function testInvalidMixedKey(): void $this->analyse([__DIR__ . '/data/invalid-key-array-item.php'], $errors); } + public function testInvalidKeyReportingCastedArrayKey(): void + { + $this->reportCastedArrayKey = true; + + $this->analyse([__DIR__ . '/data/invalid-key-array-item.php'], [ + [ + 'Invalid array key type DateTimeImmutable.', + 12, + ], + [ + 'Invalid array key type array.', + 13, + ], + [ + 'Possibly invalid array key type stdClass|string.', + 14, + ], + [ + 'Invalid array key type float.', + 26, + ], + [ + 'Invalid array key type null.', + 27, + ], + [ + 'Invalid array key type false.', + 31, + ], + ]); + } + public function testInvalidKeyInList(): void { $this->analyse([__DIR__ . '/data/invalid-key-list.php'], [ diff --git a/tests/PHPStan/Rules/Arrays/data/invalid-key-array-item.php b/tests/PHPStan/Rules/Arrays/data/invalid-key-array-item.php index 1c734968b2..e7ebc67ad6 100644 --- a/tests/PHPStan/Rules/Arrays/data/invalid-key-array-item.php +++ b/tests/PHPStan/Rules/Arrays/data/invalid-key-array-item.php @@ -26,3 +26,7 @@ 1.0 => 'aaa', null => 'aaa', ]; + +$d = [ + false => 'aaa', +]; diff --git a/tests/PHPStan/Rules/Arrays/data/unset-false-key.php b/tests/PHPStan/Rules/Arrays/data/unset-false-key.php new file mode 100644 index 0000000000..d47f059600 --- /dev/null +++ b/tests/PHPStan/Rules/Arrays/data/unset-false-key.php @@ -0,0 +1,16 @@ + $data */ +unset($data[false]); + +function test_remove_element(): void { + $modified = [1, 4, 6, 8]; + + // this would happen in the SUT + unset($modified[array_search(4, $modified, true)]); + unset($modified[array_search(5, $modified, true)]); // bug is here - will unset key `0` by accident + + assert([1, 6, 8] === $modified); // actually is [6, 8] +} From 8a0c215fc06e92d4caff4a39f72eb8156fef5fb5 Mon Sep 17 00:00:00 2001 From: Vincent Langlet Date: Thu, 9 Oct 2025 18:34:53 +0200 Subject: [PATCH 2/5] Rename --- conf/config.neon | 2 +- conf/parametersSchema.neon | 2 +- src/Rules/Arrays/AllowedArrayKeysTypes.php | 4 ++-- src/Rules/Arrays/InvalidKeyInArrayDimFetchRule.php | 4 ++-- src/Rules/Arrays/InvalidKeyInArrayItemRule.php | 4 ++-- .../Rules/Arrays/InvalidKeyInArrayDimFetchRuleTest.php | 6 +++--- .../PHPStan/Rules/Arrays/InvalidKeyInArrayItemRuleTest.php | 6 +++--- 7 files changed, 14 insertions(+), 14 deletions(-) diff --git a/conf/config.neon b/conf/config.neon index 3e57582d9e..ac85f06013 100644 --- a/conf/config.neon +++ b/conf/config.neon @@ -80,7 +80,7 @@ parameters: reportStaticMethodSignatures: false reportWrongPhpDocTypeInVarTag: false reportAnyTypeWideningInVarTag: false - reportArrayKeyCast: false + allowFloatBoolNullAsArrayKey: true reportPossiblyNonexistentGeneralArrayOffset: false reportPossiblyNonexistentConstantArrayOffset: false checkMissingOverrideMethodAttribute: false diff --git a/conf/parametersSchema.neon b/conf/parametersSchema.neon index 57016c487f..af695b61ec 100644 --- a/conf/parametersSchema.neon +++ b/conf/parametersSchema.neon @@ -88,7 +88,7 @@ parametersSchema: reportStaticMethodSignatures: bool() reportWrongPhpDocTypeInVarTag: bool() reportAnyTypeWideningInVarTag: bool() - reportArrayKeyCast: bool() + allowFloatBoolNullAsArrayKey: bool() reportPossiblyNonexistentGeneralArrayOffset: bool() reportPossiblyNonexistentConstantArrayOffset: bool() checkMissingOverrideMethodAttribute: bool() diff --git a/src/Rules/Arrays/AllowedArrayKeysTypes.php b/src/Rules/Arrays/AllowedArrayKeysTypes.php index 5ff38b7453..bd494b99a1 100644 --- a/src/Rules/Arrays/AllowedArrayKeysTypes.php +++ b/src/Rules/Arrays/AllowedArrayKeysTypes.php @@ -22,14 +22,14 @@ final class AllowedArrayKeysTypes { - public static function getType(?PhpVersion $phpVersion = null, bool $strict = false): Type + public static function getType(?PhpVersion $phpVersion = null, bool $allowFloatBoolNull = true): Type { $types = [ new IntegerType(), new StringType(), ]; - if (!$strict) { + if (!$allowFloatBoolNull) { $types[] = new BooleanType(); if ($phpVersion === null || !$phpVersion->deprecatesImplicitlyFloatConversionToInt()) { diff --git a/src/Rules/Arrays/InvalidKeyInArrayDimFetchRule.php b/src/Rules/Arrays/InvalidKeyInArrayDimFetchRule.php index ddd7963e92..120a98ce58 100644 --- a/src/Rules/Arrays/InvalidKeyInArrayDimFetchRule.php +++ b/src/Rules/Arrays/InvalidKeyInArrayDimFetchRule.php @@ -28,7 +28,7 @@ public function __construct( #[AutowiredParameter] private bool $reportMaybes, #[AutowiredParameter] - private bool $reportArrayKeyCast, + private bool $allowFloatBoolNullAsArrayKey, ) { } @@ -60,7 +60,7 @@ public function processNode(Node $node, Scope $scope): array return []; } - $allowedArrayKeys = AllowedArrayKeysTypes::getType($this->phpVersion, $this->reportArrayKeyCast); + $allowedArrayKeys = AllowedArrayKeysTypes::getType($this->phpVersion, $this->allowFloatBoolNullAsArrayKey); $dimensionType = $this->ruleLevelHelper->findTypeToCheck( $scope, $node->dim, diff --git a/src/Rules/Arrays/InvalidKeyInArrayItemRule.php b/src/Rules/Arrays/InvalidKeyInArrayItemRule.php index 3b875a6703..79216ed3a3 100644 --- a/src/Rules/Arrays/InvalidKeyInArrayItemRule.php +++ b/src/Rules/Arrays/InvalidKeyInArrayItemRule.php @@ -26,7 +26,7 @@ public function __construct( private RuleLevelHelper $ruleLevelHelper, private PhpVersion $phpVersion, #[AutowiredParameter] - private bool $reportArrayKeyCast, + private bool $allowFloatBoolNullAsArrayKey, ) { } @@ -42,7 +42,7 @@ public function processNode(Node $node, Scope $scope): array return []; } - $allowedArrayKeys = AllowedArrayKeysTypes::getType($this->phpVersion, $this->reportArrayKeyCast); + $allowedArrayKeys = AllowedArrayKeysTypes::getType($this->phpVersion, $this->allowFloatBoolNullAsArrayKey); $dimensionType = $this->ruleLevelHelper->findTypeToCheck( $scope, $node->key, diff --git a/tests/PHPStan/Rules/Arrays/InvalidKeyInArrayDimFetchRuleTest.php b/tests/PHPStan/Rules/Arrays/InvalidKeyInArrayDimFetchRuleTest.php index d63cc0eb32..fb9ba3dceb 100644 --- a/tests/PHPStan/Rules/Arrays/InvalidKeyInArrayDimFetchRuleTest.php +++ b/tests/PHPStan/Rules/Arrays/InvalidKeyInArrayDimFetchRuleTest.php @@ -15,7 +15,7 @@ class InvalidKeyInArrayDimFetchRuleTest extends RuleTestCase { - private bool $reportCastedArrayKey = false; + private bool $allowFloatBoolNullAsArrayKey = true; protected function getRule(): Rule { @@ -24,7 +24,7 @@ protected function getRule(): Rule $ruleLevelHelper, self::getContainer()->getByType(PhpVersion::class), true, - $this->reportCastedArrayKey, + $this->allowFloatBoolNullAsArrayKey, ); } @@ -168,7 +168,7 @@ public function testBug12981(): void public function testUnsetFalseKey(): void { - $this->reportCastedArrayKey = true; + $this->allowFloatBoolNullAsArrayKey = false; $this->analyse([__DIR__ . '/data/unset-false-key.php'], [ [ diff --git a/tests/PHPStan/Rules/Arrays/InvalidKeyInArrayItemRuleTest.php b/tests/PHPStan/Rules/Arrays/InvalidKeyInArrayItemRuleTest.php index efa5df3e7b..cd2c5d45b5 100644 --- a/tests/PHPStan/Rules/Arrays/InvalidKeyInArrayItemRuleTest.php +++ b/tests/PHPStan/Rules/Arrays/InvalidKeyInArrayItemRuleTest.php @@ -15,7 +15,7 @@ class InvalidKeyInArrayItemRuleTest extends RuleTestCase { - private bool $reportCastedArrayKey = false; + private bool $allowFloatBoolNullAsArrayKey = true; private bool $checkExplicitMixed = false; @@ -28,7 +28,7 @@ protected function getRule(): Rule return new InvalidKeyInArrayItemRule( $ruleLevelHelper, self::getContainer()->getByType(PhpVersion::class), - $this->reportCastedArrayKey, + $this->allowFloatBoolNullAsArrayKey, ); } @@ -107,7 +107,7 @@ public function testInvalidMixedKey(): void public function testInvalidKeyReportingCastedArrayKey(): void { - $this->reportCastedArrayKey = true; + $this->allowFloatBoolNullAsArrayKey = false; $this->analyse([__DIR__ . '/data/invalid-key-array-item.php'], [ [ From ceb44857559d8d3026dc35bd4048d83a22b854b1 Mon Sep 17 00:00:00 2001 From: Vincent Langlet Date: Thu, 9 Oct 2025 18:38:44 +0200 Subject: [PATCH 3/5] Fix --- src/Rules/Arrays/AllowedArrayKeysTypes.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Rules/Arrays/AllowedArrayKeysTypes.php b/src/Rules/Arrays/AllowedArrayKeysTypes.php index bd494b99a1..3cae964952 100644 --- a/src/Rules/Arrays/AllowedArrayKeysTypes.php +++ b/src/Rules/Arrays/AllowedArrayKeysTypes.php @@ -29,7 +29,7 @@ public static function getType(?PhpVersion $phpVersion = null, bool $allowFloatB new StringType(), ]; - if (!$allowFloatBoolNull) { + if ($allowFloatBoolNull) { $types[] = new BooleanType(); if ($phpVersion === null || !$phpVersion->deprecatesImplicitlyFloatConversionToInt()) { From 494c38710e53b1b98c361e849a50051dfb634c62 Mon Sep 17 00:00:00 2001 From: Vincent Langlet Date: Sun, 1 Feb 2026 12:25:27 +0100 Subject: [PATCH 4/5] Sort alphabetically --- conf/config.neon | 2 +- conf/parametersSchema.neon | 2 +- src/Rules/Arrays/InvalidKeyInArrayDimFetchRule.php | 4 ++-- src/Rules/Arrays/InvalidKeyInArrayItemRule.php | 4 ++-- .../Rules/Arrays/InvalidKeyInArrayDimFetchRuleTest.php | 6 +++--- .../PHPStan/Rules/Arrays/InvalidKeyInArrayItemRuleTest.php | 6 +++--- 6 files changed, 12 insertions(+), 12 deletions(-) diff --git a/conf/config.neon b/conf/config.neon index ac85f06013..3a7051412b 100644 --- a/conf/config.neon +++ b/conf/config.neon @@ -80,7 +80,7 @@ parameters: reportStaticMethodSignatures: false reportWrongPhpDocTypeInVarTag: false reportAnyTypeWideningInVarTag: false - allowFloatBoolNullAsArrayKey: true + allowBoolFloatNullAsArrayKey: true reportPossiblyNonexistentGeneralArrayOffset: false reportPossiblyNonexistentConstantArrayOffset: false checkMissingOverrideMethodAttribute: false diff --git a/conf/parametersSchema.neon b/conf/parametersSchema.neon index af695b61ec..875b768857 100644 --- a/conf/parametersSchema.neon +++ b/conf/parametersSchema.neon @@ -88,7 +88,7 @@ parametersSchema: reportStaticMethodSignatures: bool() reportWrongPhpDocTypeInVarTag: bool() reportAnyTypeWideningInVarTag: bool() - allowFloatBoolNullAsArrayKey: bool() + allowBoolFloatNullAsArrayKey: bool() reportPossiblyNonexistentGeneralArrayOffset: bool() reportPossiblyNonexistentConstantArrayOffset: bool() checkMissingOverrideMethodAttribute: bool() diff --git a/src/Rules/Arrays/InvalidKeyInArrayDimFetchRule.php b/src/Rules/Arrays/InvalidKeyInArrayDimFetchRule.php index 120a98ce58..a484b1d282 100644 --- a/src/Rules/Arrays/InvalidKeyInArrayDimFetchRule.php +++ b/src/Rules/Arrays/InvalidKeyInArrayDimFetchRule.php @@ -28,7 +28,7 @@ public function __construct( #[AutowiredParameter] private bool $reportMaybes, #[AutowiredParameter] - private bool $allowFloatBoolNullAsArrayKey, + private bool $allowBoolFloatNullAsArrayKey, ) { } @@ -60,7 +60,7 @@ public function processNode(Node $node, Scope $scope): array return []; } - $allowedArrayKeys = AllowedArrayKeysTypes::getType($this->phpVersion, $this->allowFloatBoolNullAsArrayKey); + $allowedArrayKeys = AllowedArrayKeysTypes::getType($this->phpVersion, $this->allowBoolFloatNullAsArrayKey); $dimensionType = $this->ruleLevelHelper->findTypeToCheck( $scope, $node->dim, diff --git a/src/Rules/Arrays/InvalidKeyInArrayItemRule.php b/src/Rules/Arrays/InvalidKeyInArrayItemRule.php index 79216ed3a3..ab212f2131 100644 --- a/src/Rules/Arrays/InvalidKeyInArrayItemRule.php +++ b/src/Rules/Arrays/InvalidKeyInArrayItemRule.php @@ -26,7 +26,7 @@ public function __construct( private RuleLevelHelper $ruleLevelHelper, private PhpVersion $phpVersion, #[AutowiredParameter] - private bool $allowFloatBoolNullAsArrayKey, + private bool $allowBoolFloatNullAsArrayKey, ) { } @@ -42,7 +42,7 @@ public function processNode(Node $node, Scope $scope): array return []; } - $allowedArrayKeys = AllowedArrayKeysTypes::getType($this->phpVersion, $this->allowFloatBoolNullAsArrayKey); + $allowedArrayKeys = AllowedArrayKeysTypes::getType($this->phpVersion, $this->allowBoolFloatNullAsArrayKey); $dimensionType = $this->ruleLevelHelper->findTypeToCheck( $scope, $node->key, diff --git a/tests/PHPStan/Rules/Arrays/InvalidKeyInArrayDimFetchRuleTest.php b/tests/PHPStan/Rules/Arrays/InvalidKeyInArrayDimFetchRuleTest.php index fb9ba3dceb..f393700792 100644 --- a/tests/PHPStan/Rules/Arrays/InvalidKeyInArrayDimFetchRuleTest.php +++ b/tests/PHPStan/Rules/Arrays/InvalidKeyInArrayDimFetchRuleTest.php @@ -15,7 +15,7 @@ class InvalidKeyInArrayDimFetchRuleTest extends RuleTestCase { - private bool $allowFloatBoolNullAsArrayKey = true; + private bool $allowBoolFloatNullAsArrayKey = true; protected function getRule(): Rule { @@ -24,7 +24,7 @@ protected function getRule(): Rule $ruleLevelHelper, self::getContainer()->getByType(PhpVersion::class), true, - $this->allowFloatBoolNullAsArrayKey, + $this->allowBoolFloatNullAsArrayKey, ); } @@ -168,7 +168,7 @@ public function testBug12981(): void public function testUnsetFalseKey(): void { - $this->allowFloatBoolNullAsArrayKey = false; + $this->allowBoolFloatNullAsArrayKey = false; $this->analyse([__DIR__ . '/data/unset-false-key.php'], [ [ diff --git a/tests/PHPStan/Rules/Arrays/InvalidKeyInArrayItemRuleTest.php b/tests/PHPStan/Rules/Arrays/InvalidKeyInArrayItemRuleTest.php index cd2c5d45b5..f9d902aed6 100644 --- a/tests/PHPStan/Rules/Arrays/InvalidKeyInArrayItemRuleTest.php +++ b/tests/PHPStan/Rules/Arrays/InvalidKeyInArrayItemRuleTest.php @@ -15,7 +15,7 @@ class InvalidKeyInArrayItemRuleTest extends RuleTestCase { - private bool $allowFloatBoolNullAsArrayKey = true; + private bool $allowBoolFloatNullAsArrayKey = true; private bool $checkExplicitMixed = false; @@ -28,7 +28,7 @@ protected function getRule(): Rule return new InvalidKeyInArrayItemRule( $ruleLevelHelper, self::getContainer()->getByType(PhpVersion::class), - $this->allowFloatBoolNullAsArrayKey, + $this->allowBoolFloatNullAsArrayKey, ); } @@ -107,7 +107,7 @@ public function testInvalidMixedKey(): void public function testInvalidKeyReportingCastedArrayKey(): void { - $this->allowFloatBoolNullAsArrayKey = false; + $this->allowBoolFloatNullAsArrayKey = false; $this->analyse([__DIR__ . '/data/invalid-key-array-item.php'], [ [ From 34d6dc8f485eb3ed1073cb4936f95a510a5f6e4a Mon Sep 17 00:00:00 2001 From: Vincent Langlet Date: Tue, 10 Feb 2026 22:17:41 +0100 Subject: [PATCH 5/5] Renaming --- conf/config.neon | 2 +- conf/parametersSchema.neon | 2 +- src/Rules/Arrays/AllowedArrayKeysTypes.php | 4 ++-- src/Rules/Arrays/InvalidKeyInArrayDimFetchRule.php | 4 ++-- src/Rules/Arrays/InvalidKeyInArrayItemRule.php | 4 ++-- .../Rules/Arrays/InvalidKeyInArrayDimFetchRuleTest.php | 6 +++--- .../PHPStan/Rules/Arrays/InvalidKeyInArrayItemRuleTest.php | 6 +++--- 7 files changed, 14 insertions(+), 14 deletions(-) diff --git a/conf/config.neon b/conf/config.neon index 3a7051412b..2f1f1843af 100644 --- a/conf/config.neon +++ b/conf/config.neon @@ -80,7 +80,7 @@ parameters: reportStaticMethodSignatures: false reportWrongPhpDocTypeInVarTag: false reportAnyTypeWideningInVarTag: false - allowBoolFloatNullAsArrayKey: true + reportNonIntStringArrayKey: false reportPossiblyNonexistentGeneralArrayOffset: false reportPossiblyNonexistentConstantArrayOffset: false checkMissingOverrideMethodAttribute: false diff --git a/conf/parametersSchema.neon b/conf/parametersSchema.neon index 875b768857..f5cdc825d8 100644 --- a/conf/parametersSchema.neon +++ b/conf/parametersSchema.neon @@ -88,7 +88,7 @@ parametersSchema: reportStaticMethodSignatures: bool() reportWrongPhpDocTypeInVarTag: bool() reportAnyTypeWideningInVarTag: bool() - allowBoolFloatNullAsArrayKey: bool() + reportNonIntStringArrayKey: bool() reportPossiblyNonexistentGeneralArrayOffset: bool() reportPossiblyNonexistentConstantArrayOffset: bool() checkMissingOverrideMethodAttribute: bool() diff --git a/src/Rules/Arrays/AllowedArrayKeysTypes.php b/src/Rules/Arrays/AllowedArrayKeysTypes.php index 3cae964952..4f45ad9299 100644 --- a/src/Rules/Arrays/AllowedArrayKeysTypes.php +++ b/src/Rules/Arrays/AllowedArrayKeysTypes.php @@ -22,14 +22,14 @@ final class AllowedArrayKeysTypes { - public static function getType(?PhpVersion $phpVersion = null, bool $allowFloatBoolNull = true): Type + public static function getType(?PhpVersion $phpVersion = null, bool $reportNonIntStringArrayKey = false): Type { $types = [ new IntegerType(), new StringType(), ]; - if ($allowFloatBoolNull) { + if (!$reportNonIntStringArrayKey) { $types[] = new BooleanType(); if ($phpVersion === null || !$phpVersion->deprecatesImplicitlyFloatConversionToInt()) { diff --git a/src/Rules/Arrays/InvalidKeyInArrayDimFetchRule.php b/src/Rules/Arrays/InvalidKeyInArrayDimFetchRule.php index a484b1d282..4fc2abd36f 100644 --- a/src/Rules/Arrays/InvalidKeyInArrayDimFetchRule.php +++ b/src/Rules/Arrays/InvalidKeyInArrayDimFetchRule.php @@ -28,7 +28,7 @@ public function __construct( #[AutowiredParameter] private bool $reportMaybes, #[AutowiredParameter] - private bool $allowBoolFloatNullAsArrayKey, + private bool $reportNonIntStringArrayKey, ) { } @@ -60,7 +60,7 @@ public function processNode(Node $node, Scope $scope): array return []; } - $allowedArrayKeys = AllowedArrayKeysTypes::getType($this->phpVersion, $this->allowBoolFloatNullAsArrayKey); + $allowedArrayKeys = AllowedArrayKeysTypes::getType($this->phpVersion, $this->reportNonIntStringArrayKey); $dimensionType = $this->ruleLevelHelper->findTypeToCheck( $scope, $node->dim, diff --git a/src/Rules/Arrays/InvalidKeyInArrayItemRule.php b/src/Rules/Arrays/InvalidKeyInArrayItemRule.php index ab212f2131..84b63e6727 100644 --- a/src/Rules/Arrays/InvalidKeyInArrayItemRule.php +++ b/src/Rules/Arrays/InvalidKeyInArrayItemRule.php @@ -26,7 +26,7 @@ public function __construct( private RuleLevelHelper $ruleLevelHelper, private PhpVersion $phpVersion, #[AutowiredParameter] - private bool $allowBoolFloatNullAsArrayKey, + private bool $reportNonIntStringArrayKey, ) { } @@ -42,7 +42,7 @@ public function processNode(Node $node, Scope $scope): array return []; } - $allowedArrayKeys = AllowedArrayKeysTypes::getType($this->phpVersion, $this->allowBoolFloatNullAsArrayKey); + $allowedArrayKeys = AllowedArrayKeysTypes::getType($this->phpVersion, $this->reportNonIntStringArrayKey); $dimensionType = $this->ruleLevelHelper->findTypeToCheck( $scope, $node->key, diff --git a/tests/PHPStan/Rules/Arrays/InvalidKeyInArrayDimFetchRuleTest.php b/tests/PHPStan/Rules/Arrays/InvalidKeyInArrayDimFetchRuleTest.php index f393700792..e61164f515 100644 --- a/tests/PHPStan/Rules/Arrays/InvalidKeyInArrayDimFetchRuleTest.php +++ b/tests/PHPStan/Rules/Arrays/InvalidKeyInArrayDimFetchRuleTest.php @@ -15,7 +15,7 @@ class InvalidKeyInArrayDimFetchRuleTest extends RuleTestCase { - private bool $allowBoolFloatNullAsArrayKey = true; + private bool $reportNonIntStringArrayKey = false; protected function getRule(): Rule { @@ -24,7 +24,7 @@ protected function getRule(): Rule $ruleLevelHelper, self::getContainer()->getByType(PhpVersion::class), true, - $this->allowBoolFloatNullAsArrayKey, + $this->reportNonIntStringArrayKey, ); } @@ -168,7 +168,7 @@ public function testBug12981(): void public function testUnsetFalseKey(): void { - $this->allowBoolFloatNullAsArrayKey = false; + $this->reportNonIntStringArrayKey = true; $this->analyse([__DIR__ . '/data/unset-false-key.php'], [ [ diff --git a/tests/PHPStan/Rules/Arrays/InvalidKeyInArrayItemRuleTest.php b/tests/PHPStan/Rules/Arrays/InvalidKeyInArrayItemRuleTest.php index f9d902aed6..3aa1b811f1 100644 --- a/tests/PHPStan/Rules/Arrays/InvalidKeyInArrayItemRuleTest.php +++ b/tests/PHPStan/Rules/Arrays/InvalidKeyInArrayItemRuleTest.php @@ -15,7 +15,7 @@ class InvalidKeyInArrayItemRuleTest extends RuleTestCase { - private bool $allowBoolFloatNullAsArrayKey = true; + private bool $reportNonIntStringArrayKey = false; private bool $checkExplicitMixed = false; @@ -28,7 +28,7 @@ protected function getRule(): Rule return new InvalidKeyInArrayItemRule( $ruleLevelHelper, self::getContainer()->getByType(PhpVersion::class), - $this->allowBoolFloatNullAsArrayKey, + $this->reportNonIntStringArrayKey, ); } @@ -107,7 +107,7 @@ public function testInvalidMixedKey(): void public function testInvalidKeyReportingCastedArrayKey(): void { - $this->allowBoolFloatNullAsArrayKey = false; + $this->reportNonIntStringArrayKey = true; $this->analyse([__DIR__ . '/data/invalid-key-array-item.php'], [ [