rfc:isset_ternary

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:isset_ternary [2014/09/17 07:59] – Fixed typo "?" -> "?:" mbeccatirfc:isset_ternary [2017/09/22 13:28] (current) – external edit 127.0.0.1
Line 1: Line 1:
 ====== PHP RFC: Null Coalesce Operator ====== ====== PHP RFC: Null Coalesce Operator ======
-  * Version: 0.2.1+  * Version: 0.2.3
   * Date: 2014-09-06, last updated 2014-09-16   * Date: 2014-09-06, last updated 2014-09-16
-  * Author: Andrea Fauldsajf@ajf.me +  * Author: Andrea Faulds <ajf@ajf.me
-  * Status: Under Discussion+  * Contributor: Nikita Popov <nikic@php.net> (initial patch) 
 +  * Status: Implemented (PHP 7)
   * First Published at: http://wiki.php.net/rfc/isset_ternary   * First Published at: http://wiki.php.net/rfc/isset_ternary
  
Line 9: Line 10:
 ===== Introduction ===== ===== Introduction =====
  
-PHP is a web-focussed programming language, so processing user data is a frequent activity. In such processing it is common to check for something's existence, and if it doesn't exist, use a default value. Yet the simplest way to do this, something along the lines of ''<nowiki>isset($_GET['mykey']) ? $_GET['mykey'] : ""</nowiki>'', is unnecessarily cumbersome. The short ternary operator, ''?:'' provides a way to do this much more conveniently: ''<nowiki>$_GET['mykey'] ?: ""</nowiki>''. However, this is not good practise, as if the value does not exist it will raise an ''E_NOTICE''. Because of these issues, some sort of ifsetor() operator or a modification to ''?:'''s behaviour to make this common pattern easier has been a frequent request (See References).+PHP is a web-focussed programming language, so processing user data is a frequent activity. In such processing it is common to check for something's existence, and if it doesn't exist, use a default value. Yet the simplest way to do this, something along the lines of ''<nowiki>isset($_GET['mykey']) ? $_GET['mykey'] : ""</nowiki>'', is unnecessarily cumbersome. The short ternary operator, ''?:'' provides a way to do this much more conveniently: ''<nowiki>$_GET['mykey'] ?: ""</nowiki>''. However, this is not good practice, as if the value does not exist it will raise an ''E_NOTICE''. Because of these issues, some sort of ifsetor() operator or a modification to ''?:'''s behaviour to make this common pattern easier has been a frequent request (See References).
  
 ===== Proposal ===== ===== Proposal =====
Line 42: Line 43:
 </code> </code>
  
-===== Proposed PHP Version(s) =====+This example demonstrates the precedence relative to the ternary operator and the boolean or operator, which is the same as C#:
  
-This proposed for the next PHP x, which at the time of this writing would be PHP 7.+<code php> 
 +var_dump(2 ?? 3 ? 4 : 5);      // (2 ?? 3) ? 4 : 5        => int(4) 
 +var_dump(0 || 2 ?? 3 ? 4 : 5); // ((0 || 2) ?? 3) ? 4 : 5 => int(4) 
 +</code>
  
 +This example demonstrates how it is a short-circuiting operator:
  
-===== Proposed Voting Choices =====+<code php> 
 +function foo() { 
 +    echo "executed!", PHP_EOL; 
 +
 +var_dump(true ?? foo()); // outputs bool(true), "executed!" does not appear as it short-circuited 
 +</code>
  
-As this is a language changea 2/3 majority is required. A straight Yes/No vote would be held.+===== Proposed PHP Version(s) ===== 
 + 
 +This proposed for the next PHP xwhich at the time of this writing would be PHP 7.
  
 ===== Patches and Tests ===== ===== Patches and Tests =====
Line 56: Line 68:
  
 The original patch was graciously provided by Nikita Popov. The original patch was graciously provided by Nikita Popov.
 +
 +===== Vote =====
 +
 +As this is a language change, a 2/3 majority is required. A straight Yes/No vote is being held.
 +
 +Voting started on 2014-09-20 and ended on 2014-09-27.
 +
 +<doodle title="Approve Null Coalesce Operator RFC and merge patch into master?" auth="ajf" voteType="single" closed="true">
 +   * Yes
 +   * No
 +</doodle>
  
 ===== Implementation ===== ===== Implementation =====
-After the project is implemented, this section should contain  + 
-  - the version(sit was merged to +Merged into master (which will be PHP 7): https://github.com/php/php-src/commit/2d069f640e6cccfa3ba8b1e4f375ade20fb33f64 
-  a link to the git commit(s) + 
-  - a link to the PHP manual entry for the feature+Documented at: http://php.net/manual/en/language.operators.comparison.php
  
 ===== References ===== ===== References =====
Line 77: Line 100:
  
 This list is quite probably incomplete. This list is quite probably incomplete.
 +
 +Operator precedence in C#: http://msdn.microsoft.com/en-us/library/6a71f45d.aspx
  
 ===== Rejected Features ===== ===== Rejected Features =====
 Keep this updated with features that were discussed on the mail lists. Keep this updated with features that were discussed on the mail lists.
 +
 +===== Errata =====
 +
 +The name of this RFC [[http://blog.ajf.me/2015-12-07-poorly-named-rfcs|ought to have been "null coalescing operator", not "null coalesce operator"]].
  
 ===== Changelog ===== ===== Changelog =====
  
 +  * (2016-03-13) Added Errata
 +  * v0.2.3 - Added short-circuit example
 +  * v0.2.2 - Added precedence example
   * v0.2.1 - Added chaining example   * v0.2.1 - Added chaining example
   * v0.2 - Overhauled proposal, proposing new operator ''??'' instead of an extension to ''?:''   * v0.2 - Overhauled proposal, proposing new operator ''??'' instead of an extension to ''?:''
   * v0.1 - Created   * v0.1 - Created
rfc/isset_ternary.1410940758.txt.gz · Last modified: 2017/09/22 13:28 (external edit)