Doc #80502 [Com]: Comparison of empty string to 0

From: Date: Fri, 04 Nov 2022 02:46:31 +0000
Subject: Doc #80502 [Com]: Comparison of empty string to 0
References: 1  Groups: php.doc.bugs 
Request: Send a blank email to doc-bugs+get-19482@lists.php.net to get a copy of this message
Edit report at https://bugs.php.net/bug.php?id=80502&edit=1

 ID:                 80502
 Comment by:         php dot net at sameprecision dot org
 Reported by:        craig at craigfrancis dot co dot uk
 Summary:            Comparison of empty string to 0
 Status:             Verified
 Type:               Documentation Problem
 Package:            *General Issues
 Operating System:   N/A
 PHP Version:        8.0.0
 Block user comment: N
 Private report:     N

 New Comment:

Why not stick with the most prolific scripting language on earth, javascript? 0 == ""


Previous Comments:
------------------------------------------------------------------------
[2022-11-04 02:25:50] php dot net at sameprecision dot org

Indeed this is causing problems and breaks compatibility with javascript where 0 == "". 
With PHP 8, 0 != "".

What RFC is being referenced with this?  Why would coercion to string "0" make sense here
to have "0" != "" instead of false == false or 0 == 0?

------------------------------------------------------------------------
[2020-12-10 14:21:19] craig at craigfrancis dot co dot uk

https://www.php.net/manual/en/language.operators.comparison.php

Operand 1: string, resource, int or float
Operand 2: string, resource, int or float
Result: Translate strings and resources to numbers, usual math

I have a horrible feeling this change is going to cause issues, as PHP is typically working with
user input from web forms, where the GET/POST values provided are strings, same with many other
sources (e.g. fgetcsv).

------------------------------------------------------------------------
[2020-12-10 12:49:08] cmb@php.net

Yes, that is indeed a consequence of that RFC.  Since the empty
string is not a well-formed numeric string, a string comparison is
done, and the empty string is less than any other string.  The
migration guide should not only mention == comparision, but the
other affected operations as well.  And of course the respective
documentation in the manual proper needs to be updated.

------------------------------------------------------------------------
[2020-12-10 12:27:28] craig at craigfrancis dot co dot uk

And the same with ('' == 0)... PHP 7 this would be true, PHP 8 it's false.

While I appreciate that's supposed to be false with ('' === 0), the double equals
comparison operator is supposed to be equal "after type juggling".

------------------------------------------------------------------------
[2020-12-10 12:18:56] craig at craigfrancis dot co dot uk

Description:
------------
Maybe related to RFC "string_to_number_comparison"?

In PHP 7 the comparison ('' < 0) would convert the empty string to 0, then return
false.

But in PHP 8.0.0, the empty string is now considered less-than 0?

Common issue for HTML forms, which provide all values as strings, and a blank number field is
effectively seen as 0 - e.g. entering a time with separate fields (hours and minutes), and the user
does not enter a value in the seconds field... yes, you could cast the value to an integer, but a
lot of websites out there don't.

Test script:
---------------
var_export([
    (''  < 0),
    ('1' < 0),
    ('0' < 0),
  ]);

Expected result:
----------------
array ( 0 => false, 1 => false, 2 => false, )

Actual result:
--------------
array ( 0 => true, 1 => false, 2 => false, )


------------------------------------------------------------------------



--
Edit this bug report at https://bugs.php.net/bug.php?id=80502&edit=1


Thread (5 messages)

« previous php.doc.bugs (#19482) next »