php.net |  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Bug #47409 extract() problem with array containing word "this"
Submitted: 2009-02-16 18:48 UTC Modified: 2009-12-23 16:34 UTC
From: niximor at gmail dot com Assigned:
Status: Closed Package: Scripting Engine problem
PHP Version: 5.2.9 OS: Windows Vista
Private report: No CVE-ID: None
Welcome back! If you're the original bug submitter, here's where you can edit the bug or add additional notes.
If you forgot your password, you can retrieve your password here.
Password:
Status:
Package:
Bug Type:
Summary:
From: niximor at gmail dot com
New email:
PHP Version: OS:

 

 [2009-02-16 18:48 UTC] 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

Patches

Pull Requests

History

AllCommentsChangesGit/SVN commitsRelated reports
 [2009-02-21 20:23 UTC] niximor at gmail dot com
With latest version downloaded just now (5.2.9RC4-dev) same result as with RC2 (Test1::name = test2).
 [2009-10-13 18:57 UTC] 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-12-23 16:33 UTC] 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-12-23 16:34 UTC] iliaa@php.net
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.


 [2009-12-24 13:07 UTC] svn@php.net
Automatic comment from SVN on behalf of tony2001
Revision: http://svn.php.net/viewvc/?view=revision&revision=292594
Log: fix the fix for #47409
use correct comparison and add missing scope checks to trunk
 [2010-01-20 16:07 UTC] svn@php.net
Automatic comment from SVN on behalf of johannes
Revision: http://svn.php.net/viewvc/?view=revision&revision=293778
Log: Merge 292549: Fixed bug #47409 (extract() problem with array containing word
"this"). (iliaa)
 [2010-01-25 14:11 UTC] svn@php.net
Automatic comment from SVN on behalf of johannes
Revision: http://svn.php.net/viewvc/?view=revision&revision=293982
Log: merge r292594: fix the fix for #47409 (tony2001)
 
PHP Copyright © 2001-2024 The PHP Group
All rights reserved.
Last updated: Tue Dec 03 17:01:29 2024 UTC