Re: [RFC] Deprecate type juggling to and from bool type within the function type juggling context
| From: | Gina P. Banyard | Date: | Wed, 04 Jun 2025 13:22:59 +0000 |
| Subject: | Re: [RFC] Deprecate type juggling to and from bool type within the function type juggling context | ||
| References: | 1 2 3 4 | Groups: | php.internals |
| Request: | Send a blank email to internals+get-127582@lists.php.net to get a copy of this message | ||
On Tuesday, 3 June 2025 at 18:44, Rob Landers <rob@bottled.codes> wrote:
> On Tue, Jun 3, 2025, at 18:19, Gina P. Banyard wrote:
>
>> On Monday, 2 June 2025 at 22:05, Rob Landers <rob@bottled.codes> wrote:
>>
>>> Further, this makes a ton of shorthand nearly impossible — the manual casting to bool
>>> in strict mode is one of the most annoying casts someone has to do (and people screw up order of
>>> operations all the time leading to subtle bugs worse than coercion). Bringing this into all of php
>>> is probably not a good idea.
>>
>> It would have been nice to showcase some of these shorthands rather than hiding them behind
>> some sort of mystic as a counterargument.
>> I really would like to know in which cases you use non-boolean values as argument to
>> boolean parameters.
>> People creating more subtle and worse bugs due to arbitrary casting is precisely why I want
>> to unify the typing modes, so it's good to know that we think somewhat the same.
>
> // From a real codebase (sanitized):
> $shouldStop = (bool)($result = $service->doSomething($input)) &&
> $result->isError();
>
> This pattern comes up a lot in strict mode: you have to be extra careful with casts and
> parentheses, or you can end up with subtle bugs like accidentally always returning true/false, or
> masking null/error values. In looser modes, this just “worked”, but strictness can make it
> surprisingly easy to trip up.
I don't get it, you don't need a bool cast here: https://3v4l.org/J4BWi
Even with strict_types: https://3v4l.org/dhnpc
> In my experience, a lot of “non-boolean to boolean” cases are legacy patterns or
> integrations, but sometimes we’re dealing with values that can be “falsy” in multiple ways
> (empty array, 0, '', etc.). Sometimes we’re adapting legacy code or writing wrappers
> that need to accept a wide range of inputs.
>
> The problem, in my view, is that forcing strictness everywhere makes the simple, idiomatic code
> that worked in PHP for years much more verbose; and potentially more error-prone if the developer
> isn’t careful with casts or operator precedence.
This proposal has no intention of changing the type juggling behaviour of the logical binary
operators (and unary ! op) so you shouldn't ever *need* to use both an operator and a cast
(even now with strict_types on).
Best regards,
Gina P. Banyard