PHP Bugs  
php.net | support | documentation | report a bug | advanced search | search howto | statistics | login

go to bug id or search bugs for  

Bug #27659 Cannot re-assign $this
Submitted:23 Mar 2004 1:09pm UTC Modified: 23 Aug 2004 8:10pm UTC
From:js at enradia dot com Assigned to:
Status:Bogus Category:Unknown/Other Function
Version:5.0.0RC1 OS:linux 2.6.3
View/Vote Developer Edit Submission

[23 Mar 2004 1:09pm UTC] js at enradia dot com
Description:
------------
When trying to reassign $this (from session data for 
example) I get an error: 
Fatal error: Cannot re-assign $this in... 
 
Code used: 
$this = unserialize($data); 
 
This works in php 4. Perhaps this is a feature change but 
I could not find a reference to any alternatives so I am 
submitting a bug just in case. 
 
Thanks! 
Joshua 

Reproduce code:
---------------
$this = unserialize($data);

Expected result:
----------------
Assignment of session or serialized data to $this object 

Actual result:
--------------
Fatal error: Cannot re-assign $this in... 
 
[23 Mar 2004 1:38pm UTC] pollita@php.net
This "feature" was undocumented in PHP4 and was never intended to work. 
[23 Mar 2004 1:52pm UTC] js at enradia dot com
There is a _LOT_ of code out there using that. Metabase 
among others. Is there an alternative?  This could be a 
huge problem if there is none. 
 
Thanks
[23 Mar 2004 1:57pm UTC] pollita@php.net
Take a look at PEAR::DB for an example of using a factory method (i.e.: 
 $foo = DB::connect($uri);  )

For background on why support for reassigning $this was dropped, take a
look at http://news.php.net ( php.internals mailing list in particular )
or the ZendEngine2 mailing list which is archived at
http://www.zend.com
[23 Mar 2004 2:40pm UTC] helly@php.net
Thank you for taking the time to write to us, but this is not
a bug. Please double-check the documentation available at
http://www.php.net/manual/ and the instructions on how to report
a bug at http://bugs.php.net/how-to-report.php

Actually this is expected behavior. We explicitly decided to have $this
being readonly because of interna problems with the new engine.
[15 Jul 2004 2:49am UTC] jbeall at heraldic dot us
Here is a potential solution.  Where you would have reassigned $this, do
something like this:

$this->Object = new Whatever();

Or, in the case of unserializing session data

$this->Session = unserialize($data);

Now you have a choice.  Your first option is to delegate every method
that needs to be delegated.  So, $this would need methods for every
method in $Object.  Each method would look something like:

function nameOfFunction()
{
     return $this->Object->nameOfFunction();
}

The other option is to intercept all method calls, and then decide on
the fly if they belong to $this or to $this->Object.

If you have properties, I think you are going to have to intercept with
__get() and __set().

You can read about overloading object functions with __get(), __set(),
and __call() here:
http://us2.php.net/manual/en/migration5.oop.php#migration5.oop.overload

I chose the delegation model.  If possible, I would recommend that.  If
you have properties to deal with, you will have to intercept the __get()
and __set() calls and handle them appropriately.
[15 Jul 2004 11:26pm UTC] mlemos at acm dot org
There is no assignment of $this in Metabase code. It was a
misunderstanding of the original poster. Metabase works seeminglessly in
PHP 3, PHP 4 and PHP 5.
[21 Jul 2004 6:00pm UTC] drew at estara dot com
Anyone who knows PHP objects better than me, as a simple replacement
for:

$this = $foo;

will something like this:

foreach (get_object_vars($foo) as $key => $value)
  $this->$key = $value;

work in all cases?  It's worked in all the cases I've tested it on so
far (including Gallery), but I figure there must be a problem with it
since no one's mentioned it so far.

Drew
[22 Jul 2004 3:28pm UTC] mschulznospam at qualserv dot net
Expected behavior is if a script that works in PHP 4 also works in PHP
5.  This is definitely a bug, whether it's a bug in PHP or a bug in the
script.  But this broke a whole bunch of scripts on our servers so I'm
blaming PHP.

(remove the nospam in my email address if u want to reply)
[23 Aug 2004 8:01pm UTC] shelever at ukrlink dot net
osCommerce 2.2-MS2 gets same error when open admin folder. Error in file
includes/classes/upload.php. 
On Windows/IIS5/ISAPI.

Resolwed by commenting:
// self destruct
        //  $this = null;

Worked at PHP4

Good Luck!
[23 Aug 2004 8:10pm UTC] gschlossnagle@php.net
Thank you for taking the time to write to us, but this is not
a bug. Please double-check the documentation available at
http://www.php.net/manual/ and the instructions on how to report
a bug at http://bugs.php.net/how-to-report.php

As helly posted originally, this is expected behavior.  
One of the changes between php4 and php5 is that objects 
types are no longer mutable.  You can not change $this 
in php 5, by design.
[23 Sep 2004 8:09am UTC] thejam at gmail dot com
How Silly.  We used $this for just about every result set in a db query.
 We have like a hundred applications.  I just ran a sript on our whole
htdocs directory and changed them all to $result.  Works fine.

RSS feed | show source 

PHP Copyright © 2001-2009 The PHP Group
All rights reserved.
Last updated: Sat Nov 21 10:30:49 2009 UTC