On Fri, Jan 23, 2026, at 11:48, Alexandre Daubois wrote:
> Hello everyone,
> 
> Before going further with our already under discussion RFC about
> nullable casts, Nicolas Grekas and I would like to present this new
> RFC about deprecating fuzzy casts, and adding support for Stringable
> in string parameters when using strict mode.
> 
> RFC: https://wiki.php.net/rfc/deprecate-fuzzy-casts
> 
> Thanks,
> 
> — Alexandre Daubois
> 

This is interesting. As a user of non-strict mode, I rarely need casts. That 
being said, after working on tons of strict-mode code bases, this is exactly 
the footgun I use to show how strict-mode is actually bad for their code base: 
I remove the casts and turn off strict mode, and the application actually 
crashes because it was silently handling bad inputs all over the place.

Here's a pretty good example I saw a few weeks ago:

$newBalance = (int)$walletBalance;
$wallet->store($newBalance);
/* ... later ... */
$log->append($walletBalance); // which takes a string

Now, if this string is something like "1000; drop table money" and there isn't 
proper injection protection... you're in for a bad day.

Without strict mode:
$wallet->store($walletBalance); // TypeError: cannot coerce string to int

That being said, I think the more proper solution is to simply remove strict 
mode instead of making casts stricter. Why? Sometimes you actually do need to 
use a cast to force a specific type, and you want to use the loss of 
information. Like I’m pretty sure casting a float to an integer is faster than 
calling floor(), and you end up with an integer, not a float. Secondly, to 
properly use strict-mode, you have to religiously cast everything, which hides 
errors that’d otherwise appear. But getting rid of lossy casting seems like 
trying to apply a tourniquet to the wrong limb.

— Rob

Reply via email to