Doc #73981 [Ver->Csd]: __construct not being called on extensions of DOM base classes

[email protected] Fri, 22 Sep 2023 21:36:33 +0000
Newsgroups php.doc.bugs
Message-ID <[email protected]>
Edit report at https://bugs.php.net/bug.php?id=73981&edit=1

 ID:                 73981
 Updated by:         [email protected]
 Reported by:        work at timothytown dot com
 Summary:            __construct not being called on extensions of DOM
                     base classes
-Status:             Verified
+Status:             Closed
 Type:               Documentation Problem
 Package:            DOM XML related
 Operating System:   windows
 PHP Version:        7.1.1
-Assigned To:        
+Assigned To:        nielsdos
 Block user comment: N
 Private report:     N

 New Comment:

I've added a note to the manual for this.


Previous Comments:
------------------------------------------------------------------------
[2021-07-09 12:45:13] [email protected]

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.

------------------------------------------------------------------------
[2018-07-27 12:24:00] [email protected]

Confirmed: <https://3v4l.org/sN59G>.

------------------------------------------------------------------------
[2017-01-23 18:13:03] 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;


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



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