← All results

associative-array

Group: Advanced PHPDoc types · Category: ecosystem · File: phpdoc_advanced_associative_array.php

Phan treats associative-array<K, V> as an array that is specifically not a list, so a plain list argument is rejected. PHPStan and Psalm accept associative-array only as a semantic alias of array, so they accept the same list. This records that divergence in meaning. References: - Phan Type/AssociativeArrayType.php (array that is not a list) - PHPStan/Psalm treat associative-array as an array alias

Analyzer results

AnalyzerVersionResultDiagnostics
phan 6.0.10Phan 6.0.10 php-ast version 1.1.3 PHP version used to run Phan: 8.5.11 Enforced
phpdoc_advanced_associative_array.php:32: Argument 1 ($map) is ['a','b','c'] of type array{0:'a',1:'b',2:'c'} but \Conformance\Tests\PhpdocAdvancedAssociativeArray\acceptsAssoc() takes associative-array<int,string> defined at /Users/megurine/repo/php/php-typing-conformance/conformance/tests/phpdoc_advanced_associative_array.php:23 [PhanTypeMismatchArgument]
  • Recognition: spelling resolved
  • Enforcement: 1/1 of the expected violations reported
phpstan 2.3.1PHPStan - PHP Static Analysis Tool 2.3.1 Widened to array

No diagnostics reported.

  • Recognition: spelling resolved
  • Enforcement: 0/1 of the expected violations reported
psalm 6.20.0Psalm 6.20.0@804f03c0c183d149fcd4b8c7c0c9b3fbf836d34c
next: 7.0.0-rc2
Widened to array (pzoom≠)
pzoom (Psalm port)
phpdoc_advanced_associative_array.php:23: Parameter $map has wrong type 'Conformance\Tests\PhpdocAdvancedAssociativeArray\associative-array<int, string>', should be 'array<array-key, mixed>' [MismatchingDocblockParamType]
phpdoc_advanced_associative_array.php:23: Docblock class Conformance\Tests\PhpdocAdvancedAssociativeArray\associative-array does not exist [UndefinedDocblockClass]
phpdoc_advanced_associative_array.php:28: Argument 1 of acceptsAssoc expects Conformance\Tests\PhpdocAdvancedAssociativeArray\associative-array<int, string>, but array{5: 'a', 9: 'b'} provided [InvalidArgument]
phpdoc_advanced_associative_array.php:32: Argument 1 of acceptsAssoc expects Conformance\Tests\PhpdocAdvancedAssociativeArray\associative-array<int, string>, but list{'a', 'b', 'c'} provided [InvalidArgument]
  • Recognition: spelling resolved
  • Enforcement: 0/1 of the expected violations reported
mago 1.57.0mago 1.57.0 Widened to array

No diagnostics reported.

  • Recognition: spelling resolved
  • Enforcement: 0/1 of the expected violations reported
mir 0.87.0mir 0.87.0 Unrecognized
phpdoc_advanced_associative_array.php:23: MismatchingDocblockParamType: Docblock type 'array<int, string>&array{}' for $map does not match inferred 'array' [MIR0210]
  • Recognition: spelling not resolved — reported on declaration line(s) 23
  • Enforcement: 0/1 of the expected violations reported — incidental, since the spelling was not resolved
phpantom 0.11.1phpantom_lsp 0.11.1 Not enforced

No diagnostics reported.

  • Recognition: spelling resolved
  • Enforcement: 0/1 of the expected violations reported
intelephense 1.18.5intelephense 1.18.5 Not enforced
phpdoc_advanced_associative_array.php:21: Documented type is not compatible with the declared type. [P1131]
  • Recognition: spelling resolved
  • Enforcement: 0/1 of the expected violations reported
phpactor 2026.10.07.0Phpactor 2026.10.07.0 Not enforced

No diagnostics reported.

  • Recognition: spelling resolved
  • Enforcement: 0/1 of the expected violations reported
phpy 1.0.19409phpy 1.0.19409 Unrecognized
phpdoc_advanced_associative_array.php:21: Use of unknown class: 'Conformance\Tests\PhpdocAdvancedAssociativeArray\associative-array'
  • Recognition: spelling not resolved — reported on declaration line(s) 21
  • Enforcement: 0/1 of the expected violations reported — incidental, since the spelling was not resolved
qodana 262.10968.76PhpStorm 262.10968.76 Unrecognized
phpdoc_advanced_associative_array.php:21: Argument type does not match the declared [PhpDocSignatureInspection]
phpdoc_advanced_associative_array.php:21: Undefined class 'associative-array' [PhpUndefinedClassInspection]
  • Recognition: spelling not resolved — reported on declaration line(s) 21
  • Enforcement: 0/1 of the expected violations reported — incidental, since the spelling was not resolved
noverify 0.5.5NoVerify, version 0.5.5: built on: 2025.04.22 14:36:46 OS: r-kuchinskas arm64 Commit: 4774b82f8adc53fbef38f95e97af4b953b4d1529 Unrecognized
phpdoc_advanced_associative_array.php:23: param $map miss matched with phpdoc type <<associative-array<int, string>>> [funcParamTypeMissMatch]
  • Recognition: spelling not resolved — reported on declaration line(s) 23
  • Enforcement: 0/1 of the expected violations reported — incidental, since the spelling was not resolved
steins 0.1.8steins 0.1.8 (2026-09-21 revision 76306a9) Enforced
phpdoc_advanced_associative_array.php:32: argument ['a', 'b', 'c'] to acceptsAssoc() violates declared @param associative-array<int, string> $map — declared contract violation [phpdoc.param-mismatch]
  • Recognition: spelling resolved
  • Enforcement: 1/1 of the expected violations reported
phpstan-strict 2.3.1PHPStan - PHP Static Analysis Tool 2.3.1 Widened to array

No diagnostics reported.

  • Recognition: spelling resolved
  • Enforcement: 0/1 of the expected violations reported
psalm-next 7.0.0-rc2Psalm 7.0.0-rc2@20339e3fe5b8d03bcd8061030eb2a83ad50e5783 Widened to array

No diagnostics reported.

  • Recognition: spelling resolved
  • Enforcement: 0/1 of the expected violations reported

Source

<?php

declare(strict_types=1);

namespace Conformance\Tests\PhpdocAdvancedAssociativeArray;

/**
 * `associative-array`
 *
 * Phan treats `associative-array<K, V>` as an array that is specifically not a
 * list, so a plain list argument is rejected. PHPStan and Psalm accept
 * `associative-array` only as a semantic alias of `array`, so they accept the
 * same list. This records that divergence in meaning.
 *
 * References:
 * - Phan Type/AssociativeArrayType.php (array that is not a list)
 * - PHPStan/Psalm treat `associative-array` as an `array` alias
 */

/**
 * @param associative-array<int, string> $map
 */
function acceptsAssoc(array $map): void // T: associative-array<int, string>
{
}

// A non-sequential int-keyed array is associative everywhere.
acceptsAssoc([5 => 'a', 9 => 'b']); // V

// A plain list has the same int-key/string-value element types, so alias-only
// analyzers accept it; Phan rejects it because a list is not associative.
acceptsAssoc(['a', 'b', 'c']); // E?: a list is not an associative-array (enforced by Phan)