ID: 27659
Comment by: jbeall at heraldic dot us
Reported By: js at enradia dot com
Status: Bogus
Bug Type: Unknown/Other Function
Operating System: linux 2.6.3
PHP Version: 5.0.0RC1
New Comment:
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.
Previous Comments:
------------------------------------------------------------------------
[2004-03-23 14:40:09] [EMAIL PROTECTED]
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-03-23 13:57:53] [EMAIL PROTECTED]
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 13:52:42] 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:38:14] [EMAIL PROTECTED]
This "feature" was undocumented in PHP4 and was never intended to work.
------------------------------------------------------------------------
[2004-03-23 13:09:12] 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...
------------------------------------------------------------------------
--
Edit this bug report at http://bugs.php.net/?id=27659&edit=1