XML
Empty
$childNodes
Property
Objects of the DOMDocument
, DOMNode
,
DOMProcessingInstruction
, DOMComment
,
DOMText
, DOMCdataSection
, and
DOMNotation
classes have a $childNodes
property. According to the DOM Level 2 Core, DOM Level 3 Core, and
the DOM Living Standard standards, $childNodes
must
always be an object of DOMNodeList
. Even if there are
no child nodes, in which case the DOMNodeList
object
should be empty, of course. Due to a bug, however,
$childNodes
was wrongly set to null
when
there are no child nodes. This bug has been fixed in PHP 7.3.16 and
PHP 7.4.4.
For an example, let us have a look at
DOMImplementation
:
$dom = new DOMImplementation;
$type = $dom->createDocumentType('html');
var_dump($type->childNodes);
Executing the code shown above with PHP 7.3.16 (and newer) and PHP 7.4.4 (and newer) will print the output shown below:
object(DOMNodeList)#3 (1) {
["length"]=>
int(0)
}
Executing the same code with earlier versions will print the output shown below instead:
NULL
SimpleXML and Mathematical Operations
The simplexml
extension provides a very simple and
easily usable API for working with XML. You can, for instance, use
the simplexml_load_string()
function to load an XML
document from a string into a SimpleXMLElement
object.
For some inexplicable reason, mathematical operations can be
performed on these objects:
$xml = simplexml_load_string(
'<?xml version="1.0" ?><root>1.5</root>'
);
var_dump($xml);
var_dump(2 * $xml);
Executing the code shown above with PHP 7.3 and newer will print the output shown below:
object(SimpleXMLElement)#1 (1) {
[0]=>
string(3) "1.5"
}
float(3)
Mathematical operations did not always work on
SimpleXMLElement
as shown above. Prior to PHP 7.3
values were always treated as integers:
object(SimpleXMLElement)#1 (1) {
[0]=>
string(3) "1.5"
}
int(2)
2 * 1.5
is, of course, not 2
. The
"1.5"
string contained in the text node of the XML
element represented by the SimpleXMLElement
object was
interpreted as an integer, the .5
part was cut off, and
2 * 1
was calculated.
Since PHP 7.3, mathematical operations involving
SimpleXMLElement
objects treat the text as an integer
or float, whichever is more appropriate. At the end of the day,
performing such operations is a case where the phrase “Just because
you can, doesn’t mean you should” applies. We highly recommend that
you do not use the simplexml
API at all. It can be good
for implementing a quick, one-off script, but it is not suited for
long-lived software in our opinion. Have a look at the
xmlreader
extension for read-only processing of XML.
xmlwriter
is a good choice for simple use cases of
creating XML documents. And dom
is the API of choice
for all other use cases.