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