Hi,

I have filed recent behavior change of == operator as bug #62097
https://bugs.php.net/bug.php?id=62097.
(This is already marked as "Wont fix".)


Changes are:
 https://github.com/php/php-src/commit/9344bf193c6e35c8706923953f3e63bb01cc05ed
 https://github.com/php/php-src/commit/acd711685a592c52be200e248154283c6c49c9f8

This change is intended to fix Bug #54547 
(https://bugs.php.net/bug.php?id=54547).
But there are some backward incompatibility.

I think that this change should not be applied to PHP 5.4.


On PHP, when both operands are strings look like numbers, they are
converted to numbers before comparison, for operator ==, >, <, and others.
(Examples of strings look like numbers are: "123", "-56", "0120", "3.14",
"1E5", "0xff")

Old behavior, if converted numeric value fits into int, it is
evaluated as a int.  In other case it is evaluated as a float.  (When
zend_finite is false, operand is compared as string.  But it is really
rare case.)

But changed new behavior, the case to compare as string is very
extended: Converted number value exceed 2^63-1 in 64 bit, or 2^53-1 in
32-bit environment.


This cause below incompatibility between PHP 5.4.3 and PHP 5.4.4RC2.

-------------------------------------------------------------------
var_dump("9223372036854775807" == "9223372036854775808");
// 5.4.3    => bool(true)
// 5.4.4RC2 => bool(false)  [Good, fixed]

// leading 0
var_dump("9223372036854775808" == "09223372036854775808");
// 5.4.3    => bool(true)
// 5.4.4RC2 => bool(false)  [incompatible]

// leading space
var_dump("9223372036854775808" == " 9223372036854775808");
// 5.4.3 nn   => bool(true)
// 5.4.4RC2 => bool(false)  [incompatible]

var_dump("12345678901234567890" == "12345678901234567890.0");
// 5.4.3    => bool(true)
// 5.4.4RC2 => bool(false)  [incompatible]

var_dump("0xffffffffffffffffff" == "0xFFFFFFFFFFFFFFFFFF");
// 5.4.3    => bool(true)
// 5.4.4RC2 => bool(false)   [incompatible]

var_dump("0xffffffffffffffffff" > "0xFFFFFFFFFFFFFFFFFF");
// 5.4.3    => bool(false)
// 5.4.4RC2 => bool(true)    [incompatible]
-------------------------------------------------------------------


I think any backward incompatible change should not be introduced in
major operators such as ==, anymore.  But if behavior change is applied
to string comparison operator, it should be a natural extension of
current behavior; number-like string is compared as number, not as raw
string.  (e.g. canonicalize string as number way before string match.)

-- 
OISHI Kazuo


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

Reply via email to