#42271 [Opn->Bgs]: extract EXTR_REFS and/or references

From: Date: Wed, 15 Aug 2007 08:13:11 +0000
Subject: #42271 [Opn->Bgs]: extract EXTR_REFS and/or references
References: 1  Groups: php.bugs 
Request: Send a blank email to php-bugs+get-116078@lists.php.net to get a copy of this message
ID: 42271 Updated by: jani@php.net Reported By: rodji at tut dot by -Status: Open +Status: Bogus Bug Type: Scripting Engine problem Operating System: Win32 XP sp2.2600 PHP Version: 5.2.3 New Comment: You extract $a and $b which both reference the same value so if you change either both change. No bug here -> bogus. Previous Comments: ------------------------------------------------------------------------ [2007-08-11 23:58:51] rodji at tut dot by Reproduce code: --------------- function /*&*/f($val) { //eq &f $r['a'] = $val; //equal =& $r['b'] = $val; //equal =& return $r; } //debug_zval_dump(f('old')); extract(f('old_value'), EXTR_REFS); //$t =& f('old_value'); extract($t, EXTR_REFS); unset($t); $a = 'new_value'; debug_zval_dump (&$b); Expected result: ---------------- &string(9) "old_value" refcount(2) Actual result: -------------- &string(9) "new_value" refcount(3) ------------------------------------------------------------------------ [2007-08-11 22:32:01] jani@php.net Can you provide some simpler example which makes a bit more sense..? ------------------------------------------------------------------------ [2007-08-11 09:29:05] rodji at tut dot by Description: ------------ Tested on: Apache/1.3.33 (Win32) PHP/4.4.7 and 5.2.3 trouble with references in functions Reproduce code: --------------- function args_select($args, $args_list, $def_val) { $r = array(); foreach ($args_list as $key) { if (array_key_exists($key, $args)){ $r[$key] = $args[$key]; }else{ $r[$key] = $def_val; //equal $r[$key] =& $def_val why??? //$r[$key] = (string)$def_val; //solution#1 } } return $r; } $argums = array('action'=>'edit', 'id'=>1); $select = array('action','to_do','back'); //debug_zval_dump(args_select($argums, $select, '')); extract(args_select($argums, $select, ''), EXTR_OVERWRITE | EXTR_REFS); //solution#2 why??? /*$m = args_select($argums, $select, ''); //OR //$m =& args_select($argums, $select, ''); extract($m, EXTR_OVERWRITE | EXTR_REFS); */ $to_do = 'new'; debug_zval_dump (&$back); ?> Expected result: ---------------- &string(0) "" refcount(2) Actual result: -------------- &string(3) "new" refcount(3) ------------------------------------------------------------------------ -- Edit this bug report at http://bugs.php.net/?id=42271&edit=1

« previous php.bugs (#116078) next »