rfc:in_operator

Differences

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

Link to this comparison view

Next revision
Previous revision
Next revisionBoth sides next revision
rfc:in_operator [2015/02/02 13:10] – very basic draft kelunikrfc:in_operator [2015/02/26 19:40] kelunik
Line 1: Line 1:
-====== PHP RFC: Your Title Here ====== +====== PHP RFC: In Operator ====== 
-  * Version: 0.1 +  * Version: 0.4 
-  * Date: 2015-02-02 +  * Date: 2015-02-26 
-  * Author: Niklas Kellerme@kelunik.com +  * Authors: Niklas Keller <me@kelunik.com>, Bob Weinand <bobwei9@hotmail.com> 
-  * Status: Draft+  * Status: Under Discussion
   * First Published at: http://wiki.php.net/rfc/in_operator   * First Published at: http://wiki.php.net/rfc/in_operator
  
 ===== Introduction ===== ===== Introduction =====
-This RFC adds a new ''in'' operator. It simplifies ''contains'' checks for strings and arrays and checks for accessible properties in objects.+This RFC adds a new ''in'' operator which simplifies ''contains'' checks for strings and arrays. Currently, we have to use ''in_array($needle, $haystack, true)'' or ''strpos($haystack, $needle) !== false''. These functions have a inconsistent parameter order, so it's hard to remember which is the right one for each. The ''in'' operator makes these checks way more readable. Additionally, it also works for ''Traversable''.
  
 ===== Proposal ===== ===== Proposal =====
-Add a new operator ''(expr1) in (expr2)''For strings and arrays, it checks whether ''expr2'' contains ''expr1''.+Add a new operator ''(expr1) in (expr2)''It checks whether ''expr2'' contains ''expr1''.
  
-  $contains "foo" in ["a", "b", "c"]; // false +It uses strict comparison (''==='') for array values instances of ''Traversable'' and doesn't search recursively.
-  $contains "foo" in ["foo", "bar"]; // true +
-  $contains "foo" in "foobar"; // true +
-  $contains = "php" in "foobar"; /false+
  
-For objects, it works bit differentlyit checks if ''expr1'' is a accessible property name of the ''expr2''.+<code php> 
 +$contains = "foo" in ["a""b", "c"]; // false 
 +$contains = "foo" in ["foo", "bar"]; // true 
 +$contains = "foo" in [["foo"], ["bar"]]; // false 
 +$contains = "0e0" in ["0"]; // false, because of strict comparison 
 +$contains = 0 in ["0"]; // false, because of strict comparison
  
-  $stdClass new StdClass; +$contains ["foo"] in [["foo"], ["bar"]]; // true 
-  $stdClass->foo "bar"; +$contains = ["foo"in ["foo"]; // false 
-  $contains = "foo" in $stdClass; // true +</code>
-  $contains = "bar" in $stdClass; // false+
  
-===== Backward Incompatible Changes ===== +''Traversable''s are only iterated until there's a match.
-New reserved keyword ''in''.+
  
-===== Proposed PHP Version(s===== +<code php> 
-Next major release, at the time of writing PHP 7.+function gen () { 
 +    yield "foo"; 
 +    yield "bar"; 
 +    // code below here wouldn't be executed if "bar" matches 
 +    // because it stops if there's a match. 
 +}
  
-===== RFC Impact ===== +$contains "bar" in gen(); // true 
-==== To SAPIs ==== +$contains "baz" in gen(); // false 
-Describe the impact to CLI, Development web server, embedded PHP etc.+</code>
  
-==== To Existing Extensions ==== +If ''$haystack'' is a string or integer, it's a simple ''contains'' check, integers are converted to their string representation: 
-Will existing extensions be affected?+<code php> 
 +$contains "foo" in "foobar"; // true 
 +$contains "php" in "foobar"; // false 
 +$contains 0 in "0"; // true 
 +$contains 0 in 100; // true 
 +</code>
  
-==== To Opcache ==== +**Note**: This is a difference compared to ''strpos(stringint)'' as it uses the string representation instead of searching for the the ordinal value of character.
-It is necessary to develop RFC's with opcache in mindsince opcache is core extension distributed with PHP.+
  
-Please explain how you have verified your RFC's compatibility with opcache.+Other values than ''string'', ''integer'', ''array'' or ''Traversable'' for ''$haystack'' will return false and emit a warning.
  
 +If ''$haystack'' is of type string, only ''string'' and ''integer'' are allowed as type of ''$needle''. Other types will return false and emit a warning.
 +
 +==== Why strict? ====
 +It's strict because otherwise something like ''"foo" in [0]'' would pass.
 +
 +==== Precedence ====
 +It should have the same precedence as ''instanceof'', so it's possible to negate it:
 +
 +<code php>
 +if (!$input in $validValues) {
 +    // ...
 +}
 +</code>
 +
 +===== Backward Incompatible Changes =====
 +New reserved keyword ''in''. This affects function, constant, class and method names.
 +
 +===== Proposed PHP Version(s) =====
 +Next major release, at the time of writing PHP 7.
 +
 +===== RFC Impact =====
 ==== New Constants ==== ==== New Constants ====
 A ''T_IN'' constant for use with ext/tokenizer has been added. A ''T_IN'' constant for use with ext/tokenizer has been added.
  
 ===== Open Issues ===== ===== Open Issues =====
-Make sure there are no open issues when the vote starts! +None.
- +
-===== Unaffected PHP Functionality ===== +
-List existing areas/features of PHP that will not be changed by the RFC. +
- +
-This helps avoid any ambiguity, shows that you have thought deeply about the RFC's impact, and helps reduces mail list noise.+
  
 ===== Future Scope ===== ===== Future Scope =====
-None.+There could be a syntax that allows to check for multiple values at once, e.g. 
 +<code php> 
 +$contains = ...["foo", "bar"] in ["foo", "baz", "bar"]; 
 +</code>
  
 ===== Proposed Voting Choices ===== ===== Proposed Voting Choices =====
-Requires a 2/3 majority.+Requires a 2/3 majority, simple yes / no vote.
  
 ===== Patches and Tests ===== ===== Patches and Tests =====
-Links to any external patches and tests go here. +  * https://github.com/php/php-src/pull/1121
- +
-If there is no patch, make it clear who will create a patch, or whether a volunteer to help with implementation is needed. +
- +
-Make it clear if the patch is intended to be the final patch, or is just a prototype. +
- +
-===== Implementation ===== +
-After the project is implemented, this section should contain  +
-  - the version(s) it was merged to +
-  - a link to the git commit(s) +
-  a link to the PHP manual entry for the feature +
- +
-===== References ===== +
-Links to external references, discussions or RFCs+
  
 ===== 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.
 +
 +===== Changelog =====
 +  * v0.4: Removed possibility to check multiple values using an array.
rfc/in_operator.txt · Last modified: 2017/09/22 13:28 by 127.0.0.1