|
php.net | support | documentation | report a bug | advanced search | search howto | statistics | random bug | login |
[2007-05-12 08:32 UTC] forjest at gmail dot com
Description:
------------
Bug first appeared in 4.4.2. Version 4.4.1 works okay.
5.1.4, 5.2.1 has this bug too.
-----
Seems algorithm of array copying was changed at 4.4.2 and 5.1.2 versions.
-----
This behavior cause problems in unexpected situations such as error handling functions, when array pointer reseted due copying from another array which reference to it.
Reproduce code:
---------------
$Foo = array('val1', 'val2', 'val3');
end($Foo);
var_dump(key($Foo));
$MagicInternalPointerResetter = $Foo;
var_dump(key($Foo));
--
Code describing unexpected results of this behavior listed here: http://www.pastebin.ru/10226
Expected result:
----------------
int(2) int(2)
Actual result:
--------------
int(2) int(0)
PatchesPull RequestsHistoryAllCommentsChangesGit/SVN commits
|
|||||||||||||||||||||||||||||||||||||
Copyright © 2001-2025 The PHP GroupAll rights reserved. |
Last updated: Fri Oct 24 06:00:01 2025 UTC |
/*for simple case just wrap array in some array function. That will cause small overhead, but at least save your internal pointer*/ $Foo = array('val1', 'val2', 'val3'); end($Foo); var_dump(key($Foo)); $AllOkay = array_merge($Foo); var_dump(key($Foo)); ---------- /*But to make immune running context for error handler function nothing helps, except ugly serialize/unserialize solution*/ error_reporting(E_ALL); function TestErrorHandler($severity, $message, $filename, $line, $super_globals) { global $foo; $foo = unserialize(serialize($super_globals)); } class Test { function run() { $Res = array('val1', 'val2', 'val3'); end($Res); var_dump(key($Res)); HEY;//raise notice error var_dump(key($Res)); } } $test = new Test(); set_error_handler('TestErrorHandler'); $test-> run();