← All results

Explicit-integer-key sealed shape as a list

Group: Cross-analyzer regressions · Category: regression · File: regressions_explicit_key_shape_is_list.php

array{0: string, 1: string} and array{string, string} describe the same values — a two-element list of strings — and both should satisfy a list<string> parameter. Per the cross-tool survey (#14939) analyzers diverge on whether the *explicit-key* spelling counts as a list, even though the keyless spelling agrees. Reference: phpstan#14939

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 Pass

No diagnostics reported.

phpstan 2.3.1PHPStan - PHP Static Analysis Tool 2.3.1 Pass

No diagnostics reported.

psalm 6.20.0Psalm 6.20.0@804f03c0c183d149fcd4b8c7c0c9b3fbf836d34c
next: 7.0.0-rc2
Pass
regressions_explicit_key_shape_is_list.php:27: Argument 1 of Conformance\Tests\RegressionsExplicitKeyShapeIsList\takesList expects list<string>, but parent type array{0: string, 1: string} provided [ArgumentTypeCoercion]
mago 1.57.0mago 1.57.0 Pass

No diagnostics reported.

mir 0.87.0mir 0.87.0 Pass

No diagnostics reported.

phpantom 0.11.1phpantom_lsp 0.11.1 Pass

No diagnostics reported.

intelephense 1.18.5intelephense 1.18.5 Pass

No diagnostics reported.

phpactor 2026.10.07.0Phpactor 2026.10.07.0 Pass

No diagnostics reported.

phpy 1.0.19409phpy 1.0.19409 Pass

No diagnostics reported.

qodana 262.10968.76PhpStorm 262.10968.76 Pass

No diagnostics reported.

noverify 0.5.5NoVerify, version 0.5.5: built on: 2025.04.22 14:36:46 OS: r-kuchinskas arm64 Commit: 4774b82f8adc53fbef38f95e97af4b953b4d1529 Pass
regressions_explicit_key_shape_is_list.php:19: param $list miss matched with phpdoc type <<list<string>>> [funcParamTypeMissMatch]
regressions_explicit_key_shape_is_list.php:25: param $shape miss matched with phpdoc type <<array{0: string, 1: string}>> [funcParamTypeMissMatch]
regressions_explicit_key_shape_is_list.php:31: param $shape miss matched with phpdoc type <<array{string, string}>> [funcParamTypeMissMatch]
steins 0.1.8steins 0.1.8 (2026-09-21 revision 76306a9) Pass

No diagnostics reported.

phpstan-strict 2.3.1PHPStan - PHP Static Analysis Tool 2.3.1 Pass

No diagnostics reported.

psalm-next 7.0.0-rc2Psalm 7.0.0-rc2@20339e3fe5b8d03bcd8061030eb2a83ad50e5783 Pass
regressions_explicit_key_shape_is_list.php:27: Argument 1 of Conformance\Tests\RegressionsExplicitKeyShapeIsList\takesList expects list<string>, but parent type array{0: string, 1: string} provided [ArgumentTypeCoercion]

Source

<?php

declare(strict_types=1);

namespace Conformance\Tests\RegressionsExplicitKeyShapeIsList;

/**
 * Explicit-integer-key sealed shape as a `list`.
 *
 * `array{0: string, 1: string}` and `array{string, string}` describe the same values — a
 * two-element list of strings — and both should satisfy a `list<string>` parameter.
 * Per the cross-tool survey (#14939) analyzers diverge on whether the *explicit-key*
 * spelling counts as a list, even though the keyless spelling agrees.
 *
 * Reference: https://github.com/phpstan/phpstan/discussions/14939
 */

/** @param list<string> $list */
function takesList(array $list): void // E<noverify>: NoVerify cannot evaluate the list<string> param type
{
    echo count($list);
}

/** @param array{0: string, 1: string} $shape */
function fromExplicitKeys(array $shape): void // E<noverify>: NoVerify cannot evaluate the array shape param type
{
    takesList($shape); // E<psalm>: Psalm treats the explicit-key shape array{0: string, 1: string} as not directly list<string> and reports ArgumentTypeCoercion // E<pzoom>: same ArgumentTypeCoercion as Psalm. PHPStan, Mago, and Phan accept it (#14939)
}

/** @param array{string, string} $shape */
function fromKeyless(array $shape): void // E<noverify>: NoVerify cannot evaluate the array shape param type
{
    takesList($shape); // the keyless spelling is accepted by every tool, including Psalm
}