On Mon, Feb 16, 2015 at 10:04 PM, Zeev Suraski <z...@zend.com> wrote: > That syntax poll aside, I had what I hope is some sort an enlightenment, and > I think I know what will get me to cast my vote in favor of 'strict', as a > true supporter. There's one very special conversion that's too common in > PHP to dismiss (IMHO), and is also completely harmless in 99.999% of the > cases, if not strictly 100%: > > string->int or string->float conversions, when the string looks *exactly* > like a number. Given almost all of our inputs (from databases, forms, > files, etc.) come in string form, that's by far the conversion that's going > to give us the most trouble - and is most probably the use case that by far > is going to result the largest amount of explicit casts to work around that > problem. > > What if strict mode didn't just blindly check zval.type, but actually > allowed for this one type of conversion to go through without a problem? > > No bool to int. No Apple to int. No "123 testing" to float. Just "32" to > 32 and "37.7" to 37.7. > > Can the strict supporting camp consider that option? Judging by the > examples brought up by proponents of v0.3, this type of conversion isn't > their issue. It's the 'obviously wrong' conversions that bug them. > > As a secondary concern I'd put int to float conversions where no > (meaningful) data is being lost, e.g. 37 -> 37.0, even though a tiny bit of > accuracy is lost. Rejecting this particular conversion places us at being > stricter than mostly all other languages. That said, it's a much less > common conversion so I don't feel nearly as strongly about it as the string > one. > > Last, regarding internal functions, I do agree with Rasmus and Drew. Again, > judging by the examples brought up as a part of the discussion, it seems as > if we gave ZPP developers a standard easy way of being a lot more picky > about the types of values of particular arguments, and allowing them to do > this selectively for those places that are very sensitive (e.g. > curl_setopt()) would be a more suitable solution than just turning strict > validation for all internal functions, which were built with very very > different assumptions in mind. The biggest difference between internal > functions and userland functions in the context of this RFC is that with > userland functions, we're starting with a clean slate. There are no type > hint definitions anywhere, developers can selectively add them as they see > fit. With internal functions, we have type requirements EVERYWHERE already, > but with semantics that didn't take strict typing into account at all and > evolved for almost 20 years. Strict typing the way it is now would > radically change these semantics overnight, and will make the adoption of > strict a much bigger headache than it can be, as I believe Rasmus > demonstrated. > > I think addressing these issues could get us a LOT closer to consensus and > make a lot of those who voted 'no' on v0.3 vote yes on v0.4. > So, if you'll permit me to summarize your message. The following would be palatable to you?
* Lossless coercion. This would sit somewhere between strict types and weak types as lossy conversions (object->__toString() for objects passed where string expected, any->bool) would be disallowed, but lossless conversions (numeric strings to number types, int to float, whole floats to ints, numbers to strings -- But no implicit conversions to bools, no non-numeric strings to numerics, etc...) * Exclude internal functions from the strict switch. (Perhaps have a separate switch for internal functions at a later date) With option to introduce features such as the following at a later date: * Union types (e.g. function foo((int | float) $value): (bool | string) { ... }) * Typedefs (e.g. TypeDef (int|float) numeric; -- Some defined as standard (like numeric), others user-definable) -Sara -- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php