Req #71090 [Opn]: Comparison operators should be transitive
| From: | reallfqq-php at yahoo dot fr | Date: | Fri, 29 Jul 2016 22:16:10 +0000 |
| Subject: | Req #71090 [Opn]: Comparison operators should be transitive | ||
| References: | 1 | Groups: | php.bugs |
| Request: | Send a blank email to php-bugs+get-202705@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
User updated by: reallfqq-php at yahoo dot fr
Reported by: reallfqq-php at yahoo dot fr
Summary: Comparison operators should be transitive
Status: Open
Type: Feature/Change Request
Package: Scripting Engine problem
PHP Version: 7.0.0
Block user comment: N
Private report: N
New Comment:
I take good note that, in PHP world, operator intransitiveness is not a bug, but a feature, and that
correct operators graph is a 'feature request', much like a cherry on the cake.
No wonder PHP fuses keep melting...
The problem we are talking about is language design and grammar, not comparing apples and oranges.
Do not mix programmings mistake and design flaw/broken core grammar rule, since criticity of each
case is several universes apart.
Every programming language should respect some basic rules. I am amazed I even needed to fill this
bug report, and even more amazed I feel like I need to push on it and explain those things to
people... crafting a programming language!
It seems like you do not know the essence of your field and noobs are teaching *alleged* experts.
You answer is gold: totally irrelevant. You should step away from creating programming languages, or
attend 101. For the greater good.
Anyway: there are none so deaf as those who will not listen.
Previous Comments:
------------------------------------------------------------------------
[2016-07-29 13:08:07] cmb@php.net
For reference: <https://3v4l.org/S9NjT> and
<https://3v4l.org/84MV5>.
> 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.
So comparing apples to oranges is a near-real-world use-case?
Anyhow, we can't simply change the historic behavior, because
somebody claims it would be bug (despite the behavior is exactly
documented), so I'm changing this ticket to feature request. Most
likely an RFC would be required, to cater to the supposedly
significant BC break.
------------------------------------------------------------------------
[2015-12-11 20:20:17] danack@php.net
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...
------------------------------------------------------------------------
[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