Skip to content

Commit 8f7a90c

Browse files
Fix
1 parent 706141f commit 8f7a90c

3 files changed

Lines changed: 20 additions & 12 deletions

File tree

src/Analyser/ArgumentsNormalizer.php

Lines changed: 17 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,9 @@
2222
use function array_keys;
2323
use function array_values;
2424
use function count;
25+
use function key;
2526
use function ksort;
27+
use function is_string;
2628
use function max;
2729
use function sprintf;
2830

@@ -120,16 +122,17 @@ public static function reorderCallUserFuncArrayArguments(
120122
}
121123
}
122124

123-
if ($argsArrayArg === null) {
124-
if ($arg->name === null && $i === 1) {
125-
$argsArrayArg = $arg;
126-
continue;
127-
}
128-
if ($arg->name !== null && $arg->name->toString() === 'args') {
129-
$argsArrayArg = $arg;
130-
continue;
131-
}
125+
if ($argsArrayArg !== null) {
126+
continue;
132127
}
128+
if ($arg->name === null && $i === 1) {
129+
$argsArrayArg = $arg;
130+
continue;
131+
}
132+
if ($arg->name === null || $arg->name->toString() !== 'args') {
133+
continue;
134+
}
135+
$argsArrayArg = $arg;
133136
}
134137

135138
if ($callbackArg === null || $argsArrayArg === null) {
@@ -149,8 +152,11 @@ public static function reorderCallUserFuncArrayArguments(
149152
foreach ($argsArrayArg->value->items as $item) {
150153
$key = null;
151154
if ($item->key instanceof String_) {
152-
/** @var int|string $offsetValue */
155+
/** @var int|string $key */
153156
$key = key([$item->key->value => null]);
157+
if ($key === '') {
158+
return null;
159+
}
154160
} elseif ($item->key !== null && !$item->key instanceof Int_) {
155161
// Dynamic key, we cannot be sure.
156162
return null;
@@ -161,7 +167,7 @@ public static function reorderCallUserFuncArrayArguments(
161167
$item->byRef,
162168
$item->unpack,
163169
$item->getAttributes(),
164-
\is_string($key) ? new Identifier($key) : null,
170+
is_string($key) ? new Identifier($key) : null,
165171
);
166172
}
167173

src/Rules/Functions/CallUserFuncRule.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@
1111
use PHPStan\Rules\FunctionCallParametersCheck;
1212
use PHPStan\Rules\Rule;
1313
use function count;
14-
use function ucfirst;
1514
use function sprintf;
15+
use function ucfirst;
1616

1717
/**
1818
* @implements Rule<FuncCall>

tests/PHPStan/Rules/Functions/data/call-user-func-array.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,8 @@ public function doMore(): void
5353
call_user_func_array($f, ['1' => 'foo']); // Same as call_user_func_array($f, ['foo'])
5454
call_user_func_array($f, [1 => 42]); // Same as call_user_func_array($f, [42])
5555
call_user_func_array($f, ['1' => 42]); // Same as call_user_func_array($f, [42])
56+
57+
call_user_func_array($f, ['' => 42]); // Could be reported but should at least not crash PHPStan
5658
}
5759

5860
}

0 commit comments

Comments
 (0)