On Tue, Jul 14, 2020 at 11:47 PM Björn Larsson <bjorn.x.lars...@telia.com>
wrote:

> Den 2020-07-14 kl. 15:48, skrev Nikita Popov:
> > On Thu, Jul 2, 2020 at 10:09 AM Nikita Popov <nikita....@gmail.com>
> wrote:
> >
> >> On Mon, Mar 4, 2019 at 6:00 PM Nikita Popov <nikita....@gmail.com>
> wrote:
> >>
> >>> On Wed, Feb 27, 2019 at 10:23 AM Zeev Suraski <z...@php.net> wrote:
> >>>
> >>>>
> >>>> On Tue, Feb 26, 2019 at 2:27 PM Nikita Popov <nikita....@gmail.com>
> >>>> wrote:
> >>>>
> >>>>> Hi internals,
> >>>>>
> >>>>> I think it is well known that == in PHP is a pretty big footgun. It
> >>>>> doesn't
> >>>>> have to be. I think that type juggling comparisons in a language like
> >>>>> PHP
> >>>>> have some merit, it's just that the particular semantics of == in PHP
> >>>>> make
> >>>>> it so dangerous. The biggest WTF factor is probably that 0 ==
> "foobar"
> >>>>> returns true.
> >>>>>
> >>>>> I'd like to bring forward an RFC for PHP 8 to change the semantics
> of ==
> >>>>> and other non-strict comparisons, when used between a number and a
> >>>>> string:
> >>>>>
> >>>>> https://wiki.php.net/rfc/string_to_number_comparison
> >>>>>
> >>>>> The tl;dr is that if you compare a number and a numeric string,
> they'll
> >>>>> be
> >>>>> compared as numbers. Otherwise, the number is converted into a string
> >>>>> and
> >>>>> they'll be compared as strings.
> >>>>>
> >>>>> This is a very significant change -- not so much because the actual
> BC
> >>>>> breakage is expected to be particularly large, but because it is a
> >>>>> silent
> >>>>> change in core language semantics, which makes it hard to determine
> >>>>> whether
> >>>>> or not code is affected by the change. There are things we can do
> about
> >>>>> this, for example the RFC suggests that we might want to have a
> >>>>> transition
> >>>>> mode where we perform the comparison using both the old and the new
> >>>>> semantics and warn if the result differs.
> >>>>>
> >>>>> I think we should give serious consideration to making such a change.
> >>>>> I'd
> >>>>> be interested to hear whether other people think this is worthwhile,
> and
> >>>>> how we could go about doing it, while minimizing breakage.
> >>>>>
> >>>> I generally like the direction and think we should seriously consider
> it.
> >>>>
> >>>> I think that before we make any decisions on this, or even dive too
> deep
> >>>> into the discussion - we actually need to implement this behavior,
> >>>> including the proposed INI setting you mentioned we might add in 7.4
> - and
> >>>> see what happens in some real world apps, at least in terms of
> potential
> >>>> danger (as you say, figuring out whether there's actual breakage would
> >>>> require a full audit of every potentially problematic sample.
> Ultimately,
> >>>> I think there's no question that if we were to start from scratch,
> we'd be
> >>>> going for something along these lines.  But since we're not starting
> from
> >>>> scratch - scoping the level of breakage is key here.
> >>>>
> >>>> Zeev
> >>>>
> >>> Totally agree that assessing the amount of breakage in real code is key
> >>> here. I have now implemented a warning for PHP 7.4 (for now
> unconditional,
> >>> no ini setting) that is thrown whenever the result of a comparison is
> going
> >>> to change under the currently proposed rules:
> >>> https://github.com/php/php-src/pull/3917
> >>>
> >>> I've done a few initial tests by running this against the Laravel,
> >>> Symfony and pear-core. The warning was thrown 2 times for Laravel, 1
> times
> >>> for Symfony and 2 times for pear-core. (See PR for the results.)
> >>>
> >>> Both of the warnings in pear-core pointed to implementation bugs. The
> >>> Symfony warning was due to trailing whitespace not being allowed in
> numeric
> >>> strings (something we should definitely change). One of the Laravel
> >>> warnings is ultimately a false-positive (does not change behavior),
> though
> >>> code could be improved to avoid it. I wasn't able to tell whether the
> other
> >>> one is problematic, as it affects sorting order.
> >>>
> >>> I have to say that this is a lot less warnings than I expected. Makes
> me
> >>> wonder if I didn't make an implementation mistake ^^
> >>>
> >>> Regards,
> >>> Nikita
> >>>
> >> As we're moving closer to PHP 8 feature freeze, I want to give this RFC
> a
> >> bump. I've updated the text to account for some changes that have
> happened
> >> in the meantime, such as the removal of locale-sensitivity for float to
> >> string conversions.
> >>
> >> It's been quite a while since we discussed this last, and back then the
> >> discussion was fairly positive. Some experiments with a warning mode
> also
> >> showed that the impact, at least in framework/library code, appears to
> be
> >> fairly low in practice, contrary to what one might intuitively expect.
> >>
> >> Now would be the time to decide whether or not we want to pursue this
> >> change for PHP 8.
> >>
> > And then there was silence...
> >
> > I think I'll just put this up for vote on Friday, and we'll see what
> people
> > think :)
> >
> > Nikita
>
> Seems like a very good idea!! Especially in conjunction with the RFC:
> - https://wiki.php.net/rfc/saner-numeric-strings
>
> Btw, in the RFC there is a reference to the "Trailing whitespace in numeric
> strings" RFC. Update to reference "Saner numeric strings" RFC instead?
>

Thanks, I've updated the link to point to the new proposal!

Nikita

Reply via email to