Bug #69466 [Ver]: Spaceship operator rfc discrepancy
Edit report at https://bugs.php.net/bug.php?id=69466&edit=1
ID: 69466
Updated by: ajf@php.net
Reported by: ppasindud at gmail dot com
Summary: Spaceship operator rfc discrepancy
Status: Verified
Type: Bug
Package: *General Issues
Operating System: not need
PHP Version: master-Git-2015-04-16 (Git)
Block user comment: N
Private report: N
New Comment:
This is just a mistake in the RFC, not in the implementation, unless this doesn't match the
behaviour of <, <=, ==, >= or >.
Previous Comments:
------------------------------------------------------------------------
[2015-04-19 22:01:38] stas@php.net
Comparing such objects is not a meaningful operation, in general, so the result is not well-defined.
But I don't see where the discrepancy is.
------------------------------------------------------------------------
[2015-04-19 15:39:41] levim@php.net
This ends up using zend_hash_compare; see http://lxr.php.net/xref/PHP_TRUNK/Zend/zend_hash.c#zend_hash_compare
In this case it cannot find key "a" in $b so it returns 1.
------------------------------------------------------------------------
[2015-04-16 11:17:51] cmb@php.net
It seems the RFC[1] contradicts itself:
| It is implemented by using the result of the existing internal
| compare_function that underlies the other comparison operators.
but:
| // only values are compared
| $a = (object) ["a" => "b"];
| $b = (object) ["b" => "b"];
| echo $a <=> $b; // 0
However:
var_dump($a < $b); // => bool(false)
var_dump($b < $a); // => bool(false)
And currently:
echo $a <=> $b; // => 1
echo $b <=> $a; // => 1
Apparently, there is a problem with comparing unordered values with
the spaceship operator.
[1] <https://wiki.php.net/rfc/combined-comparison-operator>
------------------------------------------------------------------------
[2015-04-16 08:32:27] ppasindud at gmail dot com
Description:
------------
http://3v4l.org/g5mCe
Test script:
---------------
<?php
$a = (object) ["a" => "c"];
$b = (object) ["a" => "b"];
echo $a <=> $b; // 1
// only values are compared
$a = (object) ["a" => "b"];
$b = (object) ["b" => "b"];
echo $a <=> $b; // 0
Expected result:
----------------
10
Actual result:
--------------
11
------------------------------------------------------------------------
--
Edit this bug report at https://bugs.php.net/bug.php?id=69466&edit=1
Thread (7 messages)