#19699 [Opn->Bgs]: 'array_walk()' violates recommended 'allow_call_time_pass_reference=Off'
| From: | vrana@php.net | Date: | Tue, 27 Jul 2004 12:23:19 +0000 |
| Subject: | #19699 [Opn->Bgs]: 'array_walk()' violates recommended 'allow_call_time_pass_reference=Off' | ||
| References: | 1 | Groups: | php.doc |
| Request: | Send a blank email to phpdoc+get-969362220@lists.php.net to get a copy of this message | ||
ID: 19699
Updated by: vrana@php.net
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] jmoore@php.net
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