php.net |  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Doc Bug #73981 __construct not being called on extensions of DOM base classes
Submitted: 2017-01-23 18:13 UTC Modified: 2023-09-22 21:36 UTC
Votes:1
Avg. Score:3.0 ± 0.0
Reproduced:1 of 1 (100.0%)
Same Version:0 (0.0%)
Same OS:0 (0.0%)
From: work at timothytown dot com Assigned: nielsdos (profile)
Status: Closed Package: DOM XML related
PHP Version: 7.1.1 OS: windows
Private report: No CVE-ID: None
View Developer Edit
Welcome! If you don't have a Git account, you can't do anything here.
If you reported this bug, you can edit this bug over here.
(description)
Block user comment
Status: Assign to:
Package:
Bug Type:
Summary:
From: work at timothytown dot com
New email:
PHP Version: OS:

 

 [2017-01-23 18:13 UTC] work at timothytown dot com
Description:
------------
When a class is registered to a DOMDocument via the registerNodeClass method, the assigned class is used to instance the return object from the DOMDOcument. However, the construct method of that class is not called. 

Test script:
---------------
class SillyTestClass extends DOMElement{
    public $foo=null;
    public function __construct($name,$value=null,$namespace=null){
        echo "calling child construct....";
        $this->foo="bar";
        parent::__construct($name,$value,$namespace);
    }
    public function sayHello(){
        echo "Why, hello there!";
    }
}

$doc=new DOMDocument();
$doc->registerNodeClass('DOMElement','SillyTestClass');
$doc->loadHTML("<div><h1>Sample</h1></div>");
//THIS WORKS! CUSTOM CLASS BEING USED
$doc->documentElement->firstChild->sayHello();

//THIS IS STILL NULL:( Never set by construct, no message saying construct was called either  
echo $doc->documentElement->firstChild->foo; 

Expected result:
----------------
output "calling child construct..." //printed from child _construct
output "Why, hello there!" //printed from child method sayHello()
output "bar" //the value of child property after being assigned in constructor

Actual result:
--------------
//only the sayHello() method fires; construct doesn't happen
Why, hello there;

Patches

Pull Requests

History

AllCommentsChangesGit/SVN commitsRelated reports
 [2017-01-24 11:30 UTC] cmb@php.net
-Package: *General Issues +Package: DOM XML related
 [2018-07-27 12:24 UTC] cmb@php.net
-Status: Open +Status: Verified
 [2018-07-27 12:24 UTC] cmb@php.net
Confirmed: <https://3v4l.org/sN59G>.
 [2021-07-09 12:45 UTC] cmb@php.net
-Type: Bug +Type: Documentation Problem
 [2021-07-09 12:45 UTC] cmb@php.net
The problem is: which arguments should be passed to the
constructor of the custom class?  This can't be determined,
because constructors are exempt from signature checks on
inheritance, so arbitrary parameters could be expected.  Even if
it we would enforce that the signature of the custom class would
match the one of the parent (what could be confusing and
restricting), it may not be possible to implement that.

Given that ::registerNodeClass() has the already documented
limitation that re-created instances loose their property values,
I think it's best to document the quirk that the constructors are
not called as well, and to leave it at this.
 [2023-09-22 21:36 UTC] nielsdos@php.net
-Status: Verified +Status: Closed -Assigned To: +Assigned To: nielsdos
 [2023-09-22 21:36 UTC] nielsdos@php.net
I've added a note to the manual for this.
 
PHP Copyright © 2001-2024 The PHP Group
All rights reserved.
Last updated: Fri Dec 27 05:01:27 2024 UTC