ID: 19699 Updated by: [EMAIL PROTECTED] Reported By: fvu at wanadoo dot nl -Status: Open +Status: Bogus Bug Type: Documentation problem Operating System: Windows PHP Version: 4.2.3,4.3.0-dev New Comment:
It's not possible to pass third parameter by reference with allow_call_time_pass_reference and it's not stated in the documentation. Thus there is no documentation error. I only noticed that first parameter is passed by reference. Previous Comments: ------------------------------------------------------------------------ [2003-07-15 07:19:31] glen at delfi dot ee btw, there's workaround for the issue. create container array, and work on it $container = array(&$thing); array_walk($a, array(&$this, 'count'), $container); and in 'count' function play on first element of $userData array see: http://hellsgate.online.ee/~glen/array_walk2.php ------------------------------------------------------------------------ [2003-07-15 07:09:18] glen at delfi dot ee well, i agree with fwu, that 1. using ampersand = passing by reference 2. using without = passing a copy maybe James should look at this example, understanding the differences: http://hellsgate.online.ee/~glen/array_walk.php and, besides, there's no way to silence pass_by_reference warning. tried @array_walk($a, array(&$this, 'count'), &$c); and array_walk($a, array(&$this, 'count'), @&$c); also tested on 5.0.0b1 ------------------------------------------------------------------------ [2002-11-26 19:25:50] tater at potatoe dot com Why not just add a flag parameter to array_walk() saying that the userdata param should be a reference? If "future versions may not support this any longer", there will be no way for array_walk to modify external variables, and that's a serious BC problem. ------------------------------------------------------------------------ [2002-10-04 03:04:31] fvu at wanadoo dot nl James, indeed your example would break existing code if '$userdata' would *always* be passed by reference. I think the solution would be to let array_walk pass '$userdata' by reference only if specified so in 'my_function' (just the same as the first parameter behaves). Your example would still work then since '$userdata' in my_function() is specified without an ampersand, so it should be passed by value. ------------------------------------------------------------------------ [2002-10-03 16:27:08] [EMAIL PROTECTED] OK. Manual is incorrect here, in PHP4 functions either specify if an arg is passed by ref or by value. In array_walk only the first argument is ever passed by reference. I can see that passing userdata by reference would be nice but unfortuantly it is too much of a big change that could break too many scripts to make as this point as people may be relying on the fact it is passed by reference. For example function my_function($value, $key, $userdata) { $userdata = strrev($userdata.$key.$value); } $array1 = array("one", "two", "three")l $mydata = "array1"; array_walk($array1, 'my_function', $mydata); This POOR example would not work with thrid parameter passed by ref so for now am changing this to a documentation problem as the documentation is currently slightly misleading in it advocates using calltime pass by reference when infact the first param only is ever passed by reference. - James ------------------------------------------------------------------------ The remainder of the comments for this report are too long. To view the rest of the comments, please view the bug report online at http://bugs.php.net/19699 -- Edit this bug report at http://bugs.php.net/?id=19699&edit=1