diff --git a/src/Psalm/Internal/Analyzer/Statements/Expression/Fetch/ArrayFetchAnalyzer.php b/src/Psalm/Internal/Analyzer/Statements/Expression/Fetch/ArrayFetchAnalyzer.php index 5e30eb5029c..9c6d85d7639 100644 --- a/src/Psalm/Internal/Analyzer/Statements/Expression/Fetch/ArrayFetchAnalyzer.php +++ b/src/Psalm/Internal/Analyzer/Statements/Expression/Fetch/ArrayFetchAnalyzer.php @@ -1737,8 +1737,10 @@ private static function handleArrayAccessOnNamedObject( ?Union &$array_access_type, bool &$has_array_access ): void { + $codebase = $statements_analyzer->getCodebase(); if (strtolower($type->value) === 'simplexmlelement' - || $statements_analyzer->getCodebase()->classExtendsOrImplements($type->value, 'SimpleXMLElement') + || ($codebase->classExists($type->value) + && $codebase->classExtendsOrImplements($type->value, 'SimpleXMLElement')) ) { $call_array_access_type = new Union([new TNull(), new TNamedObject('SimpleXMLElement')]); } elseif (strtolower($type->value) === 'domnodelist' && $stmt->dim) { diff --git a/tests/ArrayAccessTest.php b/tests/ArrayAccessTest.php index d216ca7393a..33f1cd95b31 100644 --- a/tests/ArrayAccessTest.php +++ b/tests/ArrayAccessTest.php @@ -1199,6 +1199,27 @@ function f($p): int { ', 'assertions' => ['$a===' => "array{1: 'b'}"], ], + 'noCrashOnUnknownClassArrayAccess' => [ + 'code' => <<<'PHP' + [], + 'error_levels' => ['UndefinedDocblockClass'], + ], ]; }