php.net |  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Bug #28817 Var problem when extending domDocument
Submitted: 2004-06-17 11:37 UTC Modified: 2005-01-20 12:48 UTC
Votes:6
Avg. Score:4.8 ± 0.4
Reproduced:6 of 6 (100.0%)
Same Version:1 (16.7%)
Same OS:2 (33.3%)
From: D dot Kingma at jool dot nl Assigned:
Status: Closed Package: Scripting Engine problem
PHP Version: 5CVS-2004-06-17 (dev) OS: *
Private report: No CVE-ID:
 [2004-06-17 11:37 UTC] D dot Kingma at jool dot nl
Description:
------------
When extending the domDocument class its not possible anymore to fill any class array properties (other properties can still be changed)

Reproduce code:
---------------
class z extends domDocument{
	/** variable can have name */
	var $y=Array();
	var $x;
	function __construct(){
		$this->y['doh']='me';
		$x='aaaaahhhh';
		print_r($this->y);	
		echo $x;
	}	
}
$z=new z();

Expected result:
----------------
Array ( [doh] => me ) aaaaahhhh

Actual result:
--------------
Array ( ) aaaaahhhh

Patches

Add a Patch

Pull Requests

Add a Pull Request

History

AllCommentsChangesGit/SVN commitsRelated reports
 [2004-06-19 13:36 UTC] profic at kursknet dot ru
php5.0RC3
the same problem.
But I discovered, that the second assignment do things right
e.g.:
class a extends DOMDocument {
    private $prop = array ();
    public function __construct () {parent::__construct ()}
    public function func () {
        $this->prop[] = 'test';
        $this->prop[] = 'test';
    }
}
$o = new a ();
$o->func ();
var_dump ($o);
 [2004-10-22 12:53 UTC] Jason at amp-design dot net
This is much like the constructor bug in PHP4, because $this in the constructor doesn't properly reference the object being constructed.

One way I normally get round this in PHP4 is to use the Factory pattern, where you do 

class A {

    static public function &Factory() {
        // Use this as a replacement to the constuctor
        $obj = &new A();
        $obj->var = 'Foo Bar';
        return $obj;
    }
}

you just need to construct classes using the static member function like ...

$obj = &A::Factory();

instead of 

$obj = &new A();

e.g.

class z extends domDocument{
	/** variable can have name */
	var $y=Array();
	var $x;
	function __construct(){
		$this->y['doh']='me';
		$x='aaaaahhhh';
		print_r($this->y);	
		echo $x;
	}

	function &Factory() {
		$obj = new z();
		$obj->y['doh2']='me2';
		return $obj;
	}
}
$z= &z::Factory();
print_R($z);

However this to me does seem like a PHP Bug. It's very hard with internal classes to know what behaviours are bugs and "features". A submitted http://bugs.php.net/29092 and apparantly it's not a bug, however there is no mentioning of this in the documentation. As a result the bug is really a documentation bug in my eyes.

Regards
Jason
 [2004-12-04 10:09 UTC] georg@php.net
It's fixed in mysqli now (cvs).

/Georg
 [2004-12-04 12:42 UTC] rrichards@php.net
This bug has been fixed in CVS.

Snapshots of the sources are packaged every three hours; this change
will be in the next snapshot. You can grab the snapshot at
http://snaps.php.net/.
 
Thank you for the report, and for helping us make PHP better.


 [2005-01-11 11:51 UTC] D dot Kingma at jool dot nl
The fix in CVS is reverted
 [2005-01-20 12:48 UTC] rrichards@php.net
This bug has been fixed in CVS.

Snapshots of the sources are packaged every three hours; this change
will be in the next snapshot. You can grab the snapshot at
http://snaps.php.net/.
 
Thank you for the report, and for helping us make PHP better.


 
PHP Copyright © 2001-2014 The PHP Group
All rights reserved.
Last updated: Thu Apr 17 18:02:13 2014 UTC