Re: DOMDocument->saveXML with node parameter
| From: | Nicolai Scheer | Date: | Tue, 20 Mar 2012 23:05:53 +0000 |
| Subject: | Re: DOMDocument->saveXML with node parameter | ||
| References: | 1 2 | Groups: | php.internals |
| Request: | Send a blank email to internals+get-59102@lists.php.net to get a copy of this message | ||
Hi!
On 20.03.2012 23:33, Gustavo Lopes wrote:
> On Tue, 20 Mar 2012 23:27:50 +0100, Nicolai Scheer
> <scope@planetavent.de> wrote:
>
>>
>> <?php
>> $doc = new DOMDocument();
>> $doc->loadHTML( '<html><body>Test</body></html>' );
>> $body = $doc->getElementsByTagName( 'body' )->item( 0 );
>> echo $doc->saveHTML( $body );
>>
>> If I compile 5.3.10 myself (RHEL 5.7), I get the very same behaviour as
>> described in the last comment of bug 39771:
>>
>> "PHP Warning: DOMDocument::saveHTML() expects exactly 0 parameters, 1
>> given"
>>
>> A quick look at the sources of 5.3.10 show, that there is indeed a
>> optional node parameter:
>>
>> ext/dom/document.c:2296:
>>
>> if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(),
>> "O|O!", &id, dom_document_class_entry, &nodep, dom_node_class_entry) ==
>> FAILURE) {
>> return;
>> }
>>
>> Yet, the arginfo does not reflect this, e.g.
>>
>> ext/dom/document.c:158:
>>
>> ZEND_BEGIN_ARG_INFO_EX(arginfo_dom_document_savehtml, 0, 0, 0)
>> ZEND_END_ARG_INFO();
>>
>> should read
>>
>> ZEND_BEGIN_ARG_INFO_EX(arginfo_dom_document_savehtml, 0, 0, 0)
>> ZEND_ARG_OBJ_INFO(0, node, DOMNode, 1)
>> ZEND_END_ARG_INFO();
>>
>> If I allow for passing that optional parameter by adjusting the arginfo,
>> the php snippet posted above works just fine.
>>
>> The documentation of DOMDocument::saveHTML is in sync with the
>> implementation of dom_document_save_html, it seems that just the
>> parameter checking is wrong.
>>
>
> While the arginfo is in fact wrong and should be fixed, it cannot have
> the impact you're describing. The wrong arginfo for internal functions
> only affects reflection (except if it has typehints for classes).
>
> Most likely, you're loading an old version of the DOM extension
> (compiled with an earlier version of PHP 5.3).
I see. I indeed did use the dom.so shipped with RHEL 5.7 (which delivers
php 5.3.3 if I remember correctly), but compiled php 5.3.10 on top of
it, still using the old packetized dom extension.
So I didn't fix it by adding the arginfo, but by using the self-compiled
dom extension from 5.3.10...
Thanks for pointing that out!
Greetings,
Nico