ID:               34358
 Updated by:       [EMAIL PROTECTED]
 Reported By:      pacha dot shevaev at gmail dot com
 Status:           Bogus
 Bug Type:         Scripting Engine problem
 Operating System: *
 PHP Version:      5.*
 New Comment:

It has everything to do with the new object model.  Take this code:

  $x = &$this;
  $x = 'foo';

For performance reasons we need to catch such references when they
happen in order to prevent the object being overwritten inside itself. 
It would be a bit less confusing if the error happened on the actual
assignment, but in this new object model there $x = &$this; is just as
wrong as $this = &$x since the only purpose one could have for making a
reference to $this itself is if you wanted to change it directly.  In
all valid cases this should be $x = $this.

I suppose an option would be to ignore the reference in this case and
continue on.  That seems to be happening with that last indirect case
you posted, but it would cost us a lookup.


Previous Comments:
------------------------------------------------------------------------

[2005-09-15 15:32:13] pacha dot shevaev at gmail dot com

And why does the following code work then???

<?php

class Foo {
  function Foo() {
    $this->ref =& $this;
    $this->ref->test();
  }

  function test() {
    echo 'test';
  }
}

$foo = new Foo();

?>

------------------------------------------------------------------------

[2005-09-15 15:28:02] [EMAIL PROTECTED]

It's still bogus, you can call it a BC break if you want, but we're not
going to change this back.

------------------------------------------------------------------------

[2005-09-15 15:23:37] pacha dot shevaev at gmail dot com

I'm not an expert in PHP internals but there's a guy(stereofrog) on the
SitePoint forum who has a different point of
view(http://www.sitepoint.com/forums/showpost.php?p=2146304&postcount=9):

[quote]
it's 'simply ridiculous. They have a code in zend_compile.c that
handles "$this=$x" and copy-pasted that code in the function that
comples assignment by reference. This should prevent "$this=&$x" (which
is wrong), but for some reason it "prevents" "$x=&$this" as well (which
is absolutely correct). It's pure c-level bug and has nothing to do
with "new object model" and other blah-blah.
[/quote]

------------------------------------------------------------------------

[2005-09-15 14:27:03] [EMAIL PROTECTED]

NOTE: This is about PHP 5. It might have worked in PHP 4 but it does
not and will not work in PHP 5.

------------------------------------------------------------------------

[2005-09-15 13:37:28] pacha dot shevaev at gmail dot com

I still find it a bug. I need a reference to $this for BC with PHP4 in
the following piece of code:

    function &getRootDataSource() {
        $root =& $this;
        while ($root->parent != NULL) {
            $root =& $root->parent;
        }
        return $root;
    }

------------------------------------------------------------------------

The remainder of the comments for this report are too long. To view
the rest of the comments, please view the bug report online at
    http://bugs.php.net/34358

-- 
Edit this bug report at http://bugs.php.net/?id=34358&edit=1

Reply via email to