I haven't actually run into a single issue with PHP's type system in the last few years. Literally the only thing that remains is typed arrays but that seems to be ways off due to fragmentation in how the core devs want it handled.
I haven't actually run into a single issue with PHP's type system in the last few years. Literally the only thing that remains is typed arrays but that seems to be ways off due to fragmentation in how the core devs want it handled.
declare(strict_types=1);
/\* @var array<string, int> \*/
function foo(string $key) {
echo $key;
}
$foo = [
'a' => 10,
'1' => 15,
];
foreach ($foo as $key => $_) {
foo($key);
}
The static analyzer will say this is safe (sans a bleeding edge setting in PHPStan), but it will throw a type error when it runs. Because the string '1' is, despite having strict types enabled, still implicitly cast to the number 1.PHP arrays are the most versatile part of the language. They're what actually makes the language so good in so many ways.
But typed arrays are a freaking requirement at this point and I've been screaming about it for years now... alas no response.
I wish that the implicit casting you describe only happened in the two first case. In your example PHP already knows that $foo is a hashmap, so I'd want it to keep '1' as is!
Unfortunately for all of us, for every person surprised by this behavior, there's someone who relies on it. So it'll never change.
Best we can hope is to have better array types eventually (no, the SPL isn't it).