Doc #73981 [Com]: __construct not being called on extensions of DOM base classes
[email protected] ("amin dot jigari5262 at gmail dot com") Wed, 23 Nov 2022 04:55:54 +0000
| Newsgroups | php.doc.bugs |
|---|---|
| Message-ID | <[email protected]> |
Edit report at https://bugs.php.net/bug.php?id=73981&edit=1
ID: 73981
Comment by: amin dot jigari5262 at gmail dot com
Reported by: work at timothytown dot com
Summary: __construct not being called on extensions of DOM
base classes
Status: Verified
Type: Documentation Problem
Package: DOM XML related
Operating System: windows
PHP Version: 7.1.1
Block user comment: N
Private report: N
New Comment:
I tried many times but similar code error jcpenneykiosk.review
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