php.net |  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Bug #7515 very weird, magic, invisible referencing
Submitted: 2000-10-28 10:25 UTC Modified: 2002-06-03 09:33 UTC
Votes:2
Avg. Score:3.5 ± 0.5
Reproduced:1 of 1 (100.0%)
Same Version:0 (0.0%)
Same OS:0 (0.0%)
From: waldschrott@php.net Assigned:
Status: Closed Package: Scripting Engine problem
PHP Version: 4.0 Latest CVS (28/10/2000) OS: linux + win2k
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: waldschrott@php.net
New email:
PHP Version: OS:

 

 [2000-10-28 10:25 UTC] waldschrott@php.net
This code is pretty self-explanatory...

Uncommenting the noticed (*[0]) line, causes the object contained ('root') in the instance of 'obj'  to be referenced to whatever, function test() uses a copy $o_copy but reference-counting fails and the contained object 'root' is somehow referenced to the original object in the global scope.
After having uncommented *[0] try to uncomment *[1] what should break the reference again, that made me assuming this all is caused by reference counting...

<?php
class obj {
	function method() {}
    }

function test($o_copy) {
	//$o_copy->root=&$o_copy->root; // *[1]

	$o_copy->root->set_in_copied_o=TRUE;
 	var_dump($o_copy);?><BR><?php }


$o->root=new obj();
//$o->root->method();	// *[0] uncomment this line and weirdness starts

var_dump($o);?><BR><?php
test($o);
var_dump($o);
?>

Patches

Pull Requests

History

AllCommentsChangesGit/SVN commitsRelated reports
 [2000-12-16 13:40 UTC] waldschrott@php.net
assigned to zeev, as discussed we either need
a) a permanent fix
b) a permanent deep copy function and understand this effect
as a feature and users will eventually have to use deep
copies for some containers
 [2001-12-12 08:14 UTC] yohgaki@php.net
Is this still a issue? This report is updated a year ago...
If this report is outstanding, PHP Version is better to be updated...
 [2002-01-11 16:11 UTC] bryce at redhat dot com
I'm looking at putting php 4.1.1 into the next RH release 
however I noticed that this bug still seems to be happening 

(From make test)
Running tests in /usr/src/redhat/php-4.1.1//tests/lang
...
OO Bug Test (Bug #7515) (029.phpt)          ... failed

[root@dhcpd201 lang]# cat  029.exp
success
[root@dhcpd201 lang]# cat  029.out
failure

I this something that can either be fixed or can I turn a
blind eye to this..

Phil
=--=
 [2002-04-11 15:28 UTC] rodif_bl@php.net
I have reproducted this problem... and am pretty sure what is exactly is going wrong...
<?
class foo
{
 function foo()
 {
  $this->bar = new bar();
 }
}

class bar
{
 function bar()
 {
  $this->tmp = "bar";
 }
 function do_nothing()
 {
 }
}
$foo = new foo();
$foo->bar->tmp = "test";
$foo2 = $foo;
$foo2->bar->tmp = "foo";
var_dump($foo);
var_dump($foo2);

// now....
$foo->bar->do_nothing();
$foo3 = $foo;
$foo3->bar->tmp = "bug";
var_dump($foo);
var_dump($foo3);
?>

 Basically when you call a method from a objects member object. It creates that member as a refrence. 

/* i set this to critical because i think this should be resloved right away */

- Brad

 [2002-06-03 09:33 UTC] mfischer@php.net
Zend Engine 2 fixes this.
 [2011-11-22 22:44 UTC] yann-gael at gueheneuc dot net
I compiled PHP 4.2.3 for m68k-amigaos and the test case tests/lang/029.php fails. Could you tell me more about what has been changed into the Zend engine to fix this bug so that I can track this change and the bug?

(I don't think that I should reopen this bug for m68k-amigaos, should I?)

Thanks!
Tygre
 [2011-11-22 23:31 UTC] yann-gael at gueheneuc dot net
PS. I narrowed down the test:
    class obj {
            function method() {
            }
    }
    $o->root=new obj();
    var_dump($o);

    $o->root->method();
    var_dump($o);

and its output with PHP 4.2.3 compiled for m68k-amigaos:
    object(stdClass)(1) {
      ["root"]=>
      object(obj)(0) {
      }
    }
    object(stdClass)(1) {
      ["root"]=>
      &object(obj)(0) {
      }
    }

(note the ampersand in the second dump), while, with PHP 5.2.14 for Windows, the output is:
    object(stdClass)#2 (1) {
      ["root"]=>
      object(obj)#1 (0) {
      }
    }
    object(stdClass)#2 (1) {
      ["root"]=>
      object(obj)#1 (0) {
      }
    }

Does it make sense that in the second assign "$o->root->method();", the method is viewed as a reference to and object?

Please forgive me if my question is silly, I am a newbie in OO PHP.
 
PHP Copyright © 2001-2025 The PHP Group
All rights reserved.
Last updated: Mon Feb 10 16:01:31 2025 UTC