On 14 July 2014 13:58, Andrea Faulds <a...@ajf.me> wrote: > Hello again, > > One of the issues with the RFC as it stands is how to handle bool casting. > While int, float and string only allow lossless casting (with the exception > of objects, but we can’t really do anything about that), bool’s behaviour at > the moment is quite different. I don’t think it makes sense so I won’t > discuss the current behaviour, only possible new ones. > > One option is simply to forget about being lossless and make the bool type > hint accept any value, meaning any truthy value or any falsey value would > yield what is expected without error. This would ensure that if some stupid > programmer (like myself ;) has passed in a non-boolean truthy/falsey value to > your function, it’ll be handled correctly. It would mean all your bit hacks > ($foo & FLAG etc.) would work, anything you got from $_GET (e.g. ?foobar=1). > However, this is unlikely to catch bugs in code, because literally any PHP > value would work. For that reason, I’m not sure this is the way forward. > > Another option is go completely strict and allow only boolean values, failing > everything else. This would be unlike the int, float and string hints, which > are flexible and cast, but would be more helpful for catching bugs. However, > not casting at all isn’t very “PHP-like”, and forcing people to manually cast > with (bool) might not be ideal. If we were to go for this one, I might also > accept objects casting to bool (which the default handler does), because I > don’t want to stop extension developers from making bool-like objects if they > so please. > > The final option I’m thinking about is a limited set of values. TRUE, FALSE > and NULL would be accepted, along with the integer and float values 1 and 0 > (which are the int/float TRUE and FALSE cast to, respectively), ‘1’ and the > empty string (which are the string values TRUE and FALSE cast to), and ‘0’ > (which (string)(int)FALSE would give you), along with objects casting to > boolean. It’s not a perfect solution, but I currently feel that this is the > most sensible option bar going for full strictness. > > I’m not really decided, however. Every time I try to think about this, I > usually end up going in circles. Anthony doesn’t seem to be decided either. > Hence I’m putting this up for discussion. > > What are your thoughts? > > -- > Andrea Faulds > http://ajf.me/
I've already said this in IRC but summing up for the benefit of everyone else: 1) We already have a place where there is an implicit boolean cast, namely if ($var). Personally I would find it somewhat counter-intuitive if a parameter declared as bool didn't behave the same way. 2) A common-ish use case here would be: function foo(bool $bool) {} foo($flags & A_FLAG); The intent of the expression $flags & A_FLAG is obvious to the reader as fetching a boolean, but the result will often be an integer that is neither 1 nor 0. This cannot be handled by foo((bool)$flags & A_FLAG); because of precedence, foo((bool)($flags & A_FLAG)); is messy. Andrea suggested foo($flags & A_FLAG != 0); which is better but still a little messy. Personally I would rather just accept data loss and stay consistent with the rest of the language (i.e. condition evaluation), but I do understand the PoV of those resistant to it. -- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php