Bug #71090 [Com]: Comparison operators loop

From: Date: Fri, 11 Dec 2015 20:20:18 +0000
Subject: Bug #71090 [Com]: Comparison operators loop
References: 1  Groups: php.bugs 
Request: Send a blank email to php-bugs+get-197813@lists.php.net to get a copy of this message
Edit report at https://bugs.php.net/bug.php?id=71090&edit=1 ID: 71090 Comment by: danack@php.net Reported by: reallfqq-php at yahoo dot fr Summary: Comparison operators loop Status: Open Type: Bug Package: Scripting Engine problem PHP Version: 7.0.0 Block user comment: N Private report: N New Comment: Just to note, this is the actual output. PHP Notice: Object of class stdClass could not be converted to int in ./sorting.php on line 11 PHP Stack trace: Notice: Object of class stdClass could not be converted to int in ./sorting.php on line 11 PHP 1. {main}() ./sorting.php:0 Call Stack: PHP 2. is_sorted() ./sorting.php:23 0.0002 226856 1. {main}() ./sorting.php:0 0.0003 228360 2. is_sorted() ./sorting.php:23 bool(false) Almost as if the code is trying to tell you that you're doing something bogus... Previous Comments: ------------------------------------------------------------------------ [2015-12-11 19:39:56] reallfqq-php at yahoo dot fr Short answer : *Wrong*. Try the following code: <?php $a = 15; $b = array(); $c = (object)array(); var_dump($a < $b); var_dump($b < $c); var_dump($c < $a); ?> Result: bool(true) bool(true) bool(true) ---------- Long answer: Please do not oversee the problem and oversimplify it. I am talking about operators, not constants. The problem is not INF at all. Have you checked the linked webpage? The first example show non-transitivity of some operators: php -r 'var_dump(TRUE == "a"); var_dump("a" == 0); var_dump(TRUE == 0);' Expected : bool(true) bool(true) bool(true) Actual: bool(true) bool(true) bool(false) Then, and I think that is the biggest concern, there is circular references in the operators chain, demonstrated in the bug report. The bug report example actual shows a near-real-world use-case where the sort function is unable to do its job. That is more spectacular. ------------------------------------------------------------------------ [2015-12-11 13:37:02] laruence@php.net the problem is INF, comparing sequence matters here. ------------------------------------------------------------------------ [2015-12-11 12:19:10] reallfqq-php at yahoo dot fr Description: ------------ PHP's comparison operators are circular, generatng situations where impossible equalities are considered valid. This bug is posted in reference to: http://phpsadness.com/sad/52 Test script: --------------- <?php function is_sorted($array) { $n = count($array); for ($a=0; $a<$n-1; $a++) { for ($b=$a+1; $b<$n; $b++) { if ($array[$a] > $array[$b]) { return false; } } } return true; } $array = array(INF, array(), (object)array()); sort($array); var_dump(is_sorted($array)) ?> Expected result: ---------------- bool(true) Actual result: -------------- bool(false) ------------------------------------------------------------------------ -- Edit this bug report at https://bugs.php.net/bug.php?id=71090&edit=1

« previous php.bugs (#197813) next »