Am 26.04.2022 um 11:54 schrieb Andreas Leathley<a.leath...@gmx.net>:

I have not found any past proposals or discussions to change boolean
coercions, so I would like to find out how the thoughts on internals are
to change this, or if there are any reasons not to change this that I
have not thought of.


I was actually thinking about this the other day, in the context of adding new cast functions which reject more values than our current explicit casts.

For integers, I can think of several levels of casts / type checks that you could theoretically define:

0) Plain type checking, no cast or coercion
1) Non-lossy casts, e.g. (string)(int)'42' === '42'
2) Unambiguous casts, e.g. (int)'42.0', (int)' 42 '
3) Best-guess casts, e.g. (int)'99 red balloons' === 99, (int)'1e3' === 1000
4) Zero failures, e.g. (int)'hello' === 0

When I started thinking about booleans, it was much harder to define what makes sense. I've certainly seen new programmers confused that (bool)'false' is true, and having it error would usually be more helpful; but (bool)'on' being true is useful when dealing with HTML forms, for instance.


On 26/04/2022 13:47, Christian Schneider wrote:
And would !empty($foo) even work in your world or how would empty() be defined?


That's an interesting question; but I think it would be OK for empty() to match with an *explicit* boolean cast, and both continue to accept all values, while *implicit* casts become more strict. This is how integers already work - (int)'hello' === 0, but passing 'hello' to an int parameter is an error regardless of mode, as is 'hello' + 1

Regards,

--
Rowan Tommins
[IMSoP]

--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: https://www.php.net/unsub.php

Reply via email to