php.net |  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Doc Bug #73252 DOMXPath: doc passed in constructor not always equals $xpath->document.
Submitted: 2016-10-05 12:41 UTC Modified: 2021-07-07 17:14 UTC
From: arjen at parse dot nl Assigned:
Status: Open Package: DOM XML related
PHP Version: 7.0.11 OS: Linux
Private report: No CVE-ID: None
View Add Comment Developer Edit
Welcome! If you don't have a Git account, you can't do anything here.
You can add a comment by following this link or if you reported this bug, you can edit this bug over here.
(description)
Block user comment
Status: Assign to:
Package:
Bug Type:
Summary:
From: arjen at parse dot nl
New email:
PHP Version: OS:

 

 [2016-10-05 12:41 UTC] arjen at parse dot nl
Description:
------------
When passing an object CustomDOMDocument extending DOMDocument as the DOMXPath object, the document property of DOMXpath is of type CustomDOMDocument.

As soon as the original document is destructed (because of scope), a clone of the object is stored internally, but with type DOMDocument and not the CustomDOMDocument class.


See https://3v4l.org/XLInV

Test script:
---------------
<?php


class CustomDOMDocument extends DOMDocument
{
}

function localScope()
{
    $doc = new CustomDOMDocument;
    $doc->loadHtml('<p>Test123</p>');
    $xpath = new DOMXPath($doc);
    
    return $xpath;
}


$doc = new CustomDOMDocument;
$doc->loadHtml('<p>Test123</p>');
$xpath = new DOMXPath($doc);

var_dump(get_class($xpath->document));


$xpath = new DOMXPath(new CustomDOMDocument);
var_dump(get_class($xpath->document));

$xpath = localScope();
var_dump(get_class($xpath->document));

Expected result:
----------------
string(17) "CustomDOMDocument"
string(17) "CustomDOMDocument"
string(17) "CustomDOMDocument"

Actual result:
--------------
string(17) "CustomDOMDocument"
string(11) "DOMDocument"
string(11) "DOMDocument"

Patches

Add a Patch

Pull Requests

Add a Pull Request

History

AllCommentsChangesGit/SVN commitsRelated reports
 [2021-07-07 17:04 UTC] cmb@php.net
-Type: Bug +Type: Documentation Problem
 [2021-07-07 17:04 UTC] cmb@php.net
That is because all DOMNode objects are transient, i.e. after they
have been destroyed, they will be rebuilt from the libxml2 DOM
nodes, loosing all customizations.  There is not much we can do
about that, besides documenting this issue, and tell users that
they must prevent these instances from being destroyed.
 [2021-07-07 17:14 UTC] cmb@php.net
Ah, that's not quite true.  If you ::registerNodeClass(), you will
get an instance of that class back, but still custom properties
are lost, since the instance is re-constructed.
 
PHP Copyright © 2001-2021 The PHP Group
All rights reserved.
Last updated: Thu Sep 23 00:03:38 2021 UTC