> It is a well-known feature that you can work with such data without
previously converting it explicitly to some number type.

I'm not requesting to change this: if you're doing string("3.5") + int(7),
you should still get float(10.5). What I'm suggesting we change, is
comparison of numbers and decimal strings.

Thinking about this a bit more, what about following JavaScript semantics?
I find them really good in this respect:

- when comparing two strings, always use strcmp():

var_dump("42" == "42.0"); // false
var_dump("3" < "23"); // false

- when comparing a number with a string, cast the string to a number, then
compare:

var_dump(3 < "23"); // true
var_dump("3" < 23); // true
var_dump(42 == "42"); // true
var_dump(42.0 == "42"); // true
var_dump(42.5 == "42.5"); // true
var_dump(42 == "42.0"); // true

- if the string does not represent a valid number, always return false:

var_dump(42 == "42x"); // false
var_dump(42 == "x42"); // false
var_dump(1 >= "abc"); // false
var_dump(1 < "abc"); // false

Note: JavaScript actually allows leading & trailing whitespace around the
number:

var_dump(42 == " 42 "); // true

On this last point, I'm not sure whether we should allow both leading &
trailing whitespace, or disallow both of them.
Other than that, I love the way they handle implicit conversions here. It's
so much more understandable, easy to remember, and less prone to errors IMO.

Ben

On Wed, 27 Mar 2019 at 11:28, Claude Pache <claude.pa...@gmail.com> wrote:

>
>
> > Le 27 mars 2019 à 00:09, Benjamin Morel <benjamin.mo...@gmail.com> a
> écrit :
> >
> >  - I would also strongly suggest that 2 strings are always compared
> > byte-by-byte; IMO it does (*somehow*) make sense that 42 == "42.0", but
> it
> > DOES NOT make sense that "42" == "42.0". (...)
>
> There are many ways to obtain numeric data in the form of a string from
> external sources (HTML form, database, CSV, ...) and even internal sources
> (bcmath, ...)—and note that, even when such numerical data may have a
> decimal part, it does *not* mean that they are imprecise. It is a
> well-known feature that you can work with such data without previously
> converting it explicitly to some number type. That works pretty well in PHP
> (well, except that you get intermittent obscure bugs when some third-party
> code in the same thread plays with setlocale(), but that's another
> story...) If we cease to compare numeric strings numerically, I expect that
> much code will begin to break more or less subtly, and will need to be
> thoroughly reviewed in order to be corrected. We must not change that.
>
> The core issue is that “==” is fundamentally ambiguous: should it compare
> as number, as string, as reference, ...? If we were to redesign PHP from
> scratch, we may decide other semantics than the current one (e.g., use
> distinct operators for comparing numerically and textually, as does Perl).
> But where we are now, the best thing to do is to follow the common wisdom:
> If you want to compare strings as strings, just use “===”. Or strcmp.
>
> —Claude
>
>

Reply via email to