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 [2012/07/18 11:12]
laruence
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/
  
Line 14: Line 14:
 $users = array( $users = array(
     array('Foo', 'Bar'),     array('Foo', 'Bar'),
-    array('Baz', 'Qux');+    array('Baz', 'Qux'),
 ); );
  
 // Before // Before
 foreach ($users as $user) { foreach ($users as $user) {
-    list($firstName, $lastName) = $row;+    list($firstName, $lastName) = $user;
     echo "First name: $firstName, last name: $lastName. ";     echo "First name: $firstName, last name: $lastName. ";
 } }
Line 34: Line 34:
  
 This RFC provides a behavior specification and implementation for this feature. This RFC provides a behavior specification and implementation for this feature.
- 
-===== Proposal ===== 
-1. ZEND_FE_FETCH 
-<code php> 
-<?php 
-$rows = array(array(24,2333), array(31,4666)); 
- 
-foreach ($rows as list($a, $b)) { 
-    printf("a=>%s, b=>%s\n", $a, $b); 
-} 
- 
-/** Output: 
-a=>24, b=>2333 
-a=>31, b=>4666 
-*/ 
-</code> 
- 
-2. ZEND_FE_FETCH_WITH_KEY 
-<code php> 
-<?php 
-$rows = array(array(24,2333), array(31,4666)); 
- 
-foreach ($rows as $k => list($a, $b)) { 
-    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> 
- 
-Samples with generated opcodes: 
- 
-list.php 
-<code php> 
-<?php 
-foreach (array(array(1, 2), array(3, 4)) as list($a, $b)) { 
-    echo $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 
-            > FE_RESET                                         $3      ~1, ->16 
-          > > FE_FETCH                                         $4      $3, ->16 
-          >   ZEND_OP_DATA                                              
-              FETCH_DIM_R                                      $5      $4, 1 
-        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 
-<code php> 
-<?php 
-$array = array( 
-    array(1, 2), 
-    array(3, 4) 
-); 
- 
-foreach ($array as $k => list($a, $b)) { 
-    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> 
  
 ===== Implementation details of the RFC ===== ===== Implementation details of the RFC =====
Line 143: Line 45:
 </code> </code>
  
-Without the rules:+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>
  
-With the rules:+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 155: Line 57:
 </code> </code>
  
-===== Possible additional features (vote separately): silent Token ======+===== Possible additional features (vote separately): silent token ======
 It is possible to add support of the silent token in the new context: 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>
  
-In case we want this, an additional patch will be provided.+===== Patches ===== 
 +   * foreach list: https://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>
  
-Opcodes generated: +<doodle  
- +title="Should this RFC(with supporting of silent tokenbe merged into trunk?" auth="laruence" voteType="single" closed="true"> 
-list_with_silent.php +   Yes 
-<code php> +   No 
-<?php +</doodle>
-foreach (array(array(1, 2), array(3, 4), array(5)) as @list($a, $b)) { +
-    echo $a, $b; // Without the silent token, there will be a notice since the third nested array has no second item. +
-+
-</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> +
- +
-===== Patches ===== +
-   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 215: Line 88:
   * 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: znode->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.1342609966.txt.gz · Last modified: 2017/09/22 13:28 (external edit)