#47409 [Opn->Csd]: extract() problem with array containing word "this"
ID: 47409
Updated by: iliaa@php.net
Reported By: niximor at gmail dot com
-Status: Open
+Status: Closed
Bug Type: Scripting Engine problem
Operating System: Windows Vista
PHP Version: 5.2.9
New Comment:
This bug has been fixed in SVN.
Snapshots of the sources are packaged every three hours; this change
will be in the next snapshot. You can grab the snapshot at
http://snaps.php.net/.
Thank you for the report, and for helping us make PHP better.
Previous Comments:
------------------------------------------------------------------------
[2009-12-23 16:33:58] svn@php.net
Automatic comment from SVN on behalf of iliaa
Revision: http://svn.php.net/viewvc/?view=revision&revision=292549
Log: Fixed bug #47409 (extract() problem with array containing word
"this").
------------------------------------------------------------------------
[2009-10-13 18:57:32] chrisstocktonaz at gmail dot com
I think your second proposal on expected behavior would be more
correct, rewriting $this doesn't seem right :p Below is a simple
patch:
Index: ext/standard/array.c
===================================================================
--- ext/standard/array.c (revision 289616)
+++ ext/standard/array.c (working copy)
@@ -1364,6 +1364,10 @@
if (var_exists && var_name_len ==
sizeof("GLOBALS") && !strcmp(var_name, "GLOBALS")) {
break;
}
+ /* THIS protection */
+ if (var_exists && var_name_len ==
(sizeof("this")-1) && !strcmp(var_name, "this") && EG(scope)
&& "" !=
EG(scope)->name) {
+ break;
+ }
ZVAL_STRINGL(&final_name, var_name,
var_name_len, 1);
break;
------------------------------------------------------------------------
[2009-02-21 20:23:34] niximor at gmail dot com
With latest version downloaded just now (5.2.9RC4-dev) same result as
with RC2 (Test1::name = test2).
------------------------------------------------------------------------
[2009-02-16 18:48:50] niximor at gmail dot com
Description:
------------
When I use extract() with array, that contains key "this", it behaves
really weird. See code for more info.
Reproduce code:
---------------
class Test1 {
var $name = "test1";
}
class Test2 {
var $name = "test2";
function bug() {
extract(array("this"=>new Test1()), EXTR_OVERWRITE | EXTR_REFS);
echo get_class($this)."::name = ".$this->name;
}
}
$t = new Test2();
$t->bug();
Expected result:
----------------
Test1::name = test1 (preferably)
OR
Test2::name = test2
- not combination of both.
Actual result:
--------------
Test1::name = test2
------------------------------------------------------------------------
--
Edit this bug report at http://bugs.php.net/?id=47409&edit=1
Thread (5 messages)