rfc:combined-comparison-operator

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
rfc:combined-comparison-operator [2015/01/20 17:48] ajfrfc:combined-comparison-operator [2017/09/22 13:28] (current) – external edit 127.0.0.1
Line 1: Line 1:
  
 ====== PHP RFC: Combined Comparison (Spaceship) Operator ====== ====== PHP RFC: Combined Comparison (Spaceship) Operator ======
-  * Version: 0.2+  * Version: 0.2.1
   * Date: 2014-02-12 (original), 2015-01-19 (v0.2)   * Date: 2014-02-12 (original), 2015-01-19 (v0.2)
-  * Authors: Davey Shafik <davey@php.net>, Andrea Faulds <ajf@ajf.me> +  * Authors: Davey Shafik <davey@php.net>, Andrea Faulds <ajf@ajf.me>, Stas Malyshev <stas@php.net
-  * Status: Under Discussion+  * Status: Accepted
   * First Published at: http://wiki.php.net/rfc/combined-comparison-operator   * First Published at: http://wiki.php.net/rfc/combined-comparison-operator
  
 ===== Introduction ===== ===== Introduction =====
  
-This RFC adds a new operator for combined comparison. Similar to ''strcmp()'' or ''version_compare()'' in behavior, but it can be used on all generic PHP values with the same semantics as ''%%<, <=, >=, >%%''.+This RFC adds a new operator for combined comparison. Similar to ''strcmp()'' or ''version_compare()'' in behavior, but it can be used on all generic PHP values with the same semantics as ''%%<, <=, ==, >=, >%%''.
  
 ===== Proposal ===== ===== Proposal =====
  
-Add a new operator ''(expr) %%<=>%% (expr)'',  it returns 0 if both operands are equal, 1 if the left is greater, and -1 if the right is greater.+Add a new operator ''(expr) %%<=>%% (expr)'',  it returns 0 if both operands are equal, 1 if the left is greater, and -1 if the right is greater. It uses exactly the same comparison rules as used by our existing comparison operators: ''%%<, <=, ==, >=%%'' and ''>''. (See the manual for [[http://php.net/manual/en/language.operators.comparison.php|details]])
  
-This operator (''%%<=>%%'') is often called the spaceship operator, and works on all standard PHP values. It exists in other languages: Perl, Groovy and Ruby.+This [[https://en.wikipedia.org/wiki/Three-way_comparison|"three-way comparison operator"]], also known as the "spaceship operator" (a common name in other languages), works on all standard PHP values. It exists in other languages: [[http://perldoc.perl.org/perlop.html#Equality-Operators|Perl]][[http://ruby-doc.org/core-1.9.3/Comparable.html|Ruby]], and Groovy.
  
 For [[http://perldoc.perl.org/perlop.html#Operator-Precedence-and-Associativity|consistency with Perl]], it has the same precedence as ''=='' and ''!=''. For [[http://perldoc.perl.org/perlop.html#Operator-Precedence-and-Associativity|consistency with Perl]], it has the same precedence as ''=='' and ''!=''.
  
-It uses the existing ''compare_function'' that underlies the other comparison operators.+It is implemented by using the result of the existing internal ''compare_function'' that underlies the other comparison operators. The existing comparison operators could be considered mere shorthands for ''%%<=>%%'': 
 + 
 +^ operator          ^ ''%%<=>%%'' equivalent     ^ 
 +| ''$a < $b''       | ''%%($a <=> $b) === -1%%''
 +| ''%%$a <= $b%%''  | ''%%($a <=> $b) === -1 || ($a <=> $b) === 0%%''
 +| ''$a == $b''      | ''%%($a <=> $b) === 0%%'' 
 +| ''$a != $b''      | ''%%($a <=> $b) !== 0%%'' 
 +| ''%%$a >= $b%%''  | ''%%($a <=> $b) === 1 || ($a <=> $b) === 0%%''
 +| ''$a > $b''       | ''%%($a <=> $b) === 1%%'' 
 + 
 +Here are some examples of its behaviour:
  
 <code php> <code php>
Line 60: Line 70:
 echo $a <=> $b; // 1 echo $a <=> $b; // 1
  
-// only values are compared 
 $a = (object) ["a" => "b"];  $a = (object) ["a" => "b"]; 
 $b = (object) ["b" => "b"];  $b = (object) ["b" => "b"]; 
Line 111: Line 120:
  
 Sorting by multiple columns is simpler now, too: Sorting by multiple columns is simpler now, too:
- 
  
 <code php> <code php>
Line 126: Line 134:
 } }
 </code> </code>
 +
 +It is also useful in some other contexts.
  
 ===== Backward Incompatible Changes ===== ===== Backward Incompatible Changes =====
Line 141: Line 151:
 ===== Unaffected PHP Functionality ===== ===== Unaffected PHP Functionality =====
  
-All existing comparison operators, particularly ''%%<=%%'' are unaffected by this addition.+All existing comparison operators are unaffected by this addition.
  
 ===== Future Scope ===== ===== Future Scope =====
Line 147: Line 157:
 None. None.
  
-===== Proposed Voting Choices =====+===== Vote ===== 
 + 
 +Voting started on 2015-02-02 and will to end on 2015-02-16. As this adds to the PHP language (and hence affects the PHP language specification) a 2/3 majority is required for acceptance. It is a Yes/No vote to accepting the RFC and merging the patch. 
 + 
 +<doodle title="Accept the Combined Comparison (Spaceship) Operator RFC and merge patch into master?" auth="stas" voteType="single" closed="true"> 
 +   * Yes 
 +   * No 
 +</doodle>
  
-A two third majority is required for acceptance, as it is a language change. It will be a Yes/No vote to accepting the RFC and merging. 
  
 ===== Patches and Tests ===== ===== Patches and Tests =====
Line 161: Line 177:
 ===== Changelog ===== ===== Changelog =====
  
 +  * v0.2.1 - Clarity on type-juggling behaviour and relation to other comparison operators
   * v0.2 - Updated, retargeted to PHP 7 by Andrea   * v0.2 - Updated, retargeted to PHP 7 by Andrea
   * v0.1 - Initial version by Shafik   * v0.1 - Initial version by Shafik
rfc/combined-comparison-operator.1421776124.txt.gz · Last modified: 2017/09/22 13:28 (external edit)