#19699 [Opn->Fbk]: 'array_walk()' violates recommended 'allow_call_time_pass_reference=Off'
| From: | sniper@php.net | Date: | Tue, 01 Oct 2002 23:51:35 +0000 |
| Subject: | #19699 [Opn->Fbk]: 'array_walk()' violates recommended 'allow_call_time_pass_reference=Off' | ||
| References: | 1 | Groups: | php.bugs |
| Request: | Send a blank email to php-bugs+get-21181@lists.php.net to get a copy of this message | ||
ID: 19699
Updated by: sniper@php.net
Reported By: fvu@fvu.myweb.nl
-Status: Open
+Status: Feedback
Bug Type: Arrays related
Operating System: Windows
PHP Version: 4.2.3
New Comment:
Please try using this CVS snapshot:
http://snaps.php.net/php4-latest.tar.gz
For Windows:
http://snaps.php.net/win32/php4-win32-latest.zip
Previous Comments:
------------------------------------------------------------------------
[2002-10-01 17:38:45] fvu@fvu.myweb.nl
The PHP manual contains the following note about 'array_walk()':
Note:
If func needs to be working with the actual values of the array,
specify
that the first parameter of func should be passed by reference. Then
any
changes made to those elements will be made in the array itself.
So if you want to let 'array_walk()' pass the third parameter by
reference,
you're inclined to specify that the third parameter of func should be
passed by
reference. In the example underneath, the notation '&$userData' is
used to
specify so:
function PrepareBowl($value, $key, &$userData) {
print 'Mixed so far... ' . ($userData .= "$value ") .
"<br>\n";
}
$ingredients = array('peach', 'cherry', 'alchohol');
$bowl = '';
array_walk($ingredients, 'PrepareBowl', $bowl);
print "Bowl: $bowl";
This doesn't work however; '$assembly' will not be passed by reference
and the
output will be an empty 'bowl':
Mixed so far... peach
Mixed so far... peach cherry
Mixed so far... peach cherry alchohol
Bowl:
Only when you use the '&' notation within 'array_walk()' to specify
that the
third parameter should be passed by reference:
array_walk($ingredients, 'PrepareBowl', &$bowl);
the output will be as expected:
Mixed so far... peach
Mixed so far... peach cherry
Mixed so far... peach cherry alchohol
Bowl: peach cherry alchohol
but, using the recommended php.ini setting
'allow_call_time_pass_reference=Off',
you'll receive the warning:
Warning: Call-time pass-by-reference has been deprecated - argument
passed by value; If you would like to pass it by reference, modify the
declaration of array_walk(). If you would like to enable call-time
pass-by-reference, you can set allow_call_time_pass_reference to true
in
your INI file. However, future versions may not support this any
longer.
This looks the same like bug 4116
(http://bugs.php.net/bug.php?id=4116), posted Apr 12, 2000. Although
this bug is closed with a reply that it works like the
replier think it should work, this doesn't seem logic to me because the
first
parameter *is* passed by reference without specifying; try:
array_walk(array('peach', 'cherry', 'alchohol'),
'PrepareBowl',
&$bowl);
and you'll receive:
Fatal error: Only variables can be passed by reference ...
Furthermore, I can't see much use of passing a third variable to
'array_walk()'
by value, modify it by passing it to func by reference ... without
receiving
back the modified variable.
Would it be a suggestion to let 'array_walk()' receive the third
parameter by
reference if specified so in the receiving func? This would be in line
with
the behaviour of the first parameter to func.
Freddy Vulto
------------------------------------------------------------------------
--
Edit this bug report at http://bugs.php.net/?id=19699&edit=1