Hi!

Just stumbled upon the issue described in

https://bugs.php.net/bug.php?id=39771

during a Windows -> Linux migration.

The windows binaries for php 5.3.10 and 5.4 got no problems executing
the following:

<?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.

It is very confusing, that the provided windows binaries work, but the
compiled-it-myself php on linux does not.

Any insight on the correctness of this (documented) feature as well as
the windows / linux discrepancy is very appreciated.

Sincerely,

Nico


-- 
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to