php.net |  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Bug #27659 Cannot re-assign $this
Submitted: 2004-03-23 13:09 UTC Modified: 2004-08-23 20:10 UTC
From: js at enradia dot com Assigned:
Status: Not a bug Package: Unknown/Other Function
PHP Version: 5.0.0RC1 OS: linux 2.6.3
Private report: No CVE-ID: None
View Add Comment Developer Edit
Welcome! If you don't have a Git account, you can't do anything here.
You can add a comment by following this link or if you reported this bug, you can edit this bug over here.
(description)
Block user comment
Status: Assign to:
Package:
Bug Type:
Summary:
From: js at enradia dot com
New email:
PHP Version: OS:

 

 [2004-03-23 13:09 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... 
 

Patches

Add a Patch

Pull Requests

Add a Pull Request

History

AllCommentsChangesGit/SVN commitsRelated reports
 [2004-03-23 13:38 UTC] pollita@php.net
This "feature" was undocumented in PHP4 and was never intended to work.  
 [2004-03-23 13:52 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
 [2004-03-23 13:57 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

 [2004-03-23 14:40 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.
 [2004-07-15 02:49 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.
 [2004-07-15 23:26 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.
 [2004-07-21 18:00 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
 [2004-07-22 15:28 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)
 [2004-08-23 20:01 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!
 [2004-08-23 20:10 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.
 [2004-09-23 08:09 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.
 
PHP Copyright © 2001-2018 The PHP Group
All rights reserved.
Last updated: Thu Jul 19 17:01:25 2018 UTC