rfc:foreachlist

Differences

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

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
rfc:foreachlist [2011/07/23 17:32]
laruence update patches
rfc:foreachlist [2017/09/22 13:28] (current)
Line 3: Line 3:
   * Date: 2011-07-06   * Date: 2011-07-06
   * Author: Xinchen Hui <laruence@php.net>   * Author: Xinchen Hui <laruence@php.net>
-  * Status: Under Discussion+  * Status: Implemented
   * First Published at: http://wiki.php.net/rfc/foreachlist/   * First Published at: http://wiki.php.net/rfc/foreachlist/
  
 ===== Introduction ===== ===== Introduction =====
  
-T_LIST can not be used with foreach before. +This feature introduces list() support in foreach constructs:
-<code php> +
-<?php +
-foreach (array(array(1, 2), array(3, 4)) as list($a, $b)) { +
-  /* won't work */ +
-+
-</code>+
  
-And there comes a feature request:  #10203 [[https://bugs.php.net/bug.php?id=10203|allow foreach($array as list($a,$b)]] 
- 
-I think this feature could make PHP code more flexible, So I am working on a solution to proviode that. 
- 
-===== Proposal ===== 
-1. ZEND_FE_FETCH 
 <code php> <code php>
 <?php <?php
-foreach (array(array(24,2333), array(31,4666)) as list($a,$b)) { +$users = array( 
-    printf("a=>%s, b=>%s\n", $a, $b); +    array('Foo''Bar'), 
-+    array('Baz''Qux'), 
-/** output: +);
-a=>24, b=>2333 +
-a=>31, b=>4666 +
-*/ +
-</code>+
  
-2. ZEND_FE_FETCH_WITH_KEY +// Before 
-<code php> +foreach ($users as $user) { 
-<?php +    list($firstName, $lastName= $user; 
-foreach (array(array(24,2333), array(31,4666)) as $k => list($a, $b)) { +    echo "First name: $firstNamelast name: $lastName. ";
-    printf("key:%s, a=>%s, b=>%s\n", $k, $a, $b);+
 } }
-/** output: 
-key:0, a=>24, b=>2333 
-key:1, a=>31, b=>4666 
-*/ 
-</code> 
  
-Opcodes generated: +// After 
- +foreach ($users as list($firstName, $lastName)) { 
-list.php +    echo "First name: $firstNamelast name: $lastName. ";
-<code php> +
-<?php +
-foreach (array(array(1, 2), array(3, 4)) as list($a, $b)) { +
-    echo $a, $b;+
 } }
 </code> </code>
  
-<code> +This feature eliminates the use of a redundant variable ($user in the example above)reduces code verbosity in typical cases of iterating structured datasuch as SQL result setsand it doesn't introduce new keywordsbut simply reuses a familiar PHP construct in a new context.
-        >   INIT_ARRAY                                       ~0      1 +
-              ADD_ARRAY_ELEMENT                                ~0      2 +
-              INIT_ARRAY                                       ~1      ~0 +
-              INIT_ARRAY                                       ~2      3 +
-              ADD_ARRAY_ELEMENT                                ~2      4 +
-              ADD_ARRAY_ELEMENT                                ~1      ~2 +
-            > FE_RESET                                         $3      ~1->16 +
-          > > FE_FETCH                                         $4      $3->16 +
-          >   ZEND_OP_DATA                                              +
-              FETCH_DIM_R                                      $5      $4+
-        10      ASSIGN                                                   !1$5 +
-        11      FETCH_DIM_R                                      $7      $4, 0 +
-        12      ASSIGN                                                   !0, $7 +
-      13      ECHO                                                     !0 +
-        14      ECHO                                                     !1 +
-      15    > JMP                                                      ->7 +
-        16  >   SWITCH_FREE                                              $3              1                1 +
-</code>+
  
-list_with_key.php +It's a commonly requested feature, and there is evidence that people already expect list() should work in this scenario:  #10203 [[https://bugs.php.net/bug.php?id=10203|allow foreach($array as list($a,$b)]]
-<code php+
-<?php +
-$array array( +
-    array(12), +
-    array(3, 4) +
-);+
  
-foreach ($array as $k => list($a, $b)) { +This RFC provides behavior specification and implementation for this feature.
-    echo $k, $a, $b; +
-+
-</code> +
- +
-<code> +
-        >   INIT_ARRAY                                       ~0      1 +
-              ADD_ARRAY_ELEMENT                                ~0      2 +
-              INIT_ARRAY                                       ~1      ~0 +
-            INIT_ARRAY                                       ~2      3 +
-              ADD_ARRAY_ELEMENT                                ~2      4 +
-            ADD_ARRAY_ELEMENT                                ~1      ~2 +
-              ASSIGN                                                   !0, ~1 +
-          > FE_RESET                                         $4      !0, ->19 +
-          > > FE_FETCH                                         $5      $4, ->19 +
-          >   ZEND_OP_DATA                                     ~10      +
-        10      FETCH_DIM_R                                      $6      $5, 1 +
-        11      ASSIGN                                                   !3, $6 +
-        12      FETCH_DIM_R                                      $8      $5, 0 +
-        13      ASSIGN                                                   !2, $8 +
-        14      ASSIGN                                                   !1, ~10 +
-      15      ECHO                                                     !1 +
-        16      ECHO                                                     !2 +
-        17      ECHO                                                     !3 +
-      18    > JMP                                                      ->8 +
-        19  >   SWITCH_FREE                                              $4 +
-  10    20    > RETURN                                                   1 +
-</code>+
  
-===== More about RFC ===== +===== Implementation details of the RFC ===== 
-In order to avoid the reduce/reduce conflict, I have to add the new bison rules to the existing "foreach_variable", which would otherwise bring a side-effect, that is :+In order to avoid the reduce/reduce conflict, new bison rules will be added to the existing "foreach_variable", to avoid this side effect:
  
-considering this script: 
 <code php> <code php>
 <?php <?php
Line 123: Line 45:
 </code> </code>
  
-before patched:+Without the new patch:
 <code> <code>
 PHP Parse error:  syntax error, unexpected '&', expecting T_STRING or T_VARIABLE or '$' in /home/huixc/test.php on line 2 PHP Parse error:  syntax error, unexpected '&', expecting T_STRING or T_VARIABLE or '$' in /home/huixc/test.php on line 2
 </code> </code>
  
-after patched:+With the new patch:
 <code> <code>
 PHP Fatal error:  Key element cannot be a reference in /home/huixc/test.php on line 2 PHP Fatal error:  Key element cannot be a reference in /home/huixc/test.php on line 2
Line 135: Line 57:
 </code> </code>
  
-===== Silent Token ====== +===== Possible additional features (vote separately): silent token ====== 
-about silent token '@',  is it neccessary to be supported :+It is possible to add support of the silent token in the new context:
 <code php> <code php>
-foreach (array(array(1,3,4), array(1, 2)) as @list($a, $b, $c)) { +$array = array(array(1,3,4), array(1, 2))
-}+foreach ($array as @list($a, $b, $c)) { 
 +                                  1
 </code> </code>
-if yes, the second patch in the following patchs list can be used. 
  
-Opcodes generated:+===== Patches ===== 
 +   * foreach listhttps://github.com/laruence/php-src/tree/foreachlist_nosilenttoken 
 +   * foreach list with supporting of silent token: https://github.com/laruence/php-src/tree/foreachlist 
 +===== Vote ===== 
 +<doodle  
 +title="Should this RFC be merged into trunk?" auth="laruence" voteType="single" closed="true"> 
 +   * Yes 
 +   * No 
 +</doodle>
  
-list_with_silent.php +<doodle  
-<code php> +title="Should this RFC(with supporting of silent tokenbe merged into trunk?" auth="laruence" voteType="single" closed="true"> 
-<?php +   Yes 
-foreach (array(array(1, 2), array(3, 4), array(5)) as @list($a, $b)) { +   No 
-    echo $a, $b; /* without the silent token, there will be a notice since the third item of array has no index 1*/ +</doodle>
-+
-</code> +
- +
-<code> +
-        >   INIT_ARRAY                                       ~0      1 +
-              ADD_ARRAY_ELEMENT                                ~0      2 +
-              INIT_ARRAY                                       ~1      ~0 +
-              INIT_ARRAY                                       ~2      3 +
-              ADD_ARRAY_ELEMENT                                ~2      4 +
-              ADD_ARRAY_ELEMENT                                ~1      ~2 +
-              INIT_ARRAY                                       ~3      5 +
-              ADD_ARRAY_ELEMENT                                ~1      ~3 +
-            > FE_RESET                                         $4      ~1, ->22 +
-          > > FE_FETCH                                         $5      $4, ->22 +
-        10  >   ZEND_OP_DATA                                              +
-        11      BEGIN_SILENCE                                    ~6       +
-        12      FETCH_DIM_R                                      $9      $5, 1 +
-        13      FETCH_W                      local               $8      'b' +
-        14      ASSIGN                                                   $8, $9 +
-        15      FETCH_DIM_R                                      $11     $5, 0 +
-        16      FETCH_W                      local               $7      'a' +
-        17      ASSIGN                                                   $7, $11 +
-        18      END_SILENCE                                              ~6 +
-      19      ECHO                                                     !0 +
-        20      ECHO                                                     !1 +
-      21    > JMP                                                      ->9 +
-        22  >   SWITCH_FREE                                              $4 +
-      23    > RETURN                                                   1 +
-</code> +
-===== Patchs ===== +
-   http://www.laruence.com/php-dev/php-5.4.0svn-add-foreach-list-support.patch +
-   http://www.laruence.com/php-dev/php-5.4.0svn-add-foreach-list-with-slient-support.patch +
-===== Tests ===== +
-   * http://www.laruence.com/php-dev/foreachList.001.phpt +
-   * http://www.laruence.com/php-dev/foreachList.002.phpt+
 ===== Changelog ===== ===== Changelog =====
   * 2011-07-06 Xinchen Hui: Initial RFC creation   * 2011-07-06 Xinchen Hui: Initial RFC creation
Line 192: Line 87:
   * 2011-07-07 Xinchen Hui: Updated sencode patch   * 2011-07-07 Xinchen Hui: Updated sencode patch
   * 2011-07-08 Xinchen Hui: Added opcodes with silent token   * 2011-07-08 Xinchen Hui: Added opcodes with silent token
-  * 2011-07-24 Xinchen Hui: Updated patches that fixed a bug: EA may be depend on an uninitialized value (thanks to Felipe)+  * 2011-07-24 Xinchen Hui: Updated patches that fixed a bug: znode->EA may be depend on an uninitialized value (thanks to Felipe) 
 +  * 2012-07-18 Phidev: Rewrote the RFC 
 +  * 2012-08-18 Xinchen Hui: Open voting 
 +  * 2012-08-25 Xinchen Hui: Close voting 
rfc/foreachlist.1311442364.txt.gz · Last modified: 2017/09/22 13:28 (external edit)