summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNikita Popov <nikic@php.net>2016-08-30 13:06:22 +0200
committerNikita Popov <nikic@php.net>2016-08-30 13:06:32 +0200
commitd49024c6ded6eea1f73bed895716b8494ea7b440 (patch)
treecff8379ba72645c49dd0533ca574a96a08e4db2b
parent51a564e50557093ec42206301d097dd4f2127acb (diff)
parentbfd4277008d3bda95ff5b418c60d41d50488d33b (diff)
downloadphp-git-d49024c6ded6eea1f73bed895716b8494ea7b440.tar.gz
Merge branch 'PHP-7.0' into PHP-7.1
-rw-r--r--NEWS2
-rw-r--r--ext/simplexml/simplexml.c20
-rw-r--r--ext/simplexml/tests/bug72957.phpt16
-rw-r--r--ext/simplexml/tests/bug72971_2.phpt35
4 files changed, 60 insertions, 13 deletions
diff --git a/NEWS b/NEWS
index c18f87f7d7..ec64fc53da 100644
--- a/NEWS
+++ b/NEWS
@@ -53,6 +53,8 @@ PHP NEWS
- SimpleXML:
. Fixed bug #72971 (SimpleXML isset/unset do not respect namespace). (Nikita)
+ . Fixed bug #72957 (Null coalescing operator doesn't behave as expected with
+ SimpleXMLElement). (Nikita)
- Standard:
. Fixed bug #72920 (Accessing a private constant using constant() creates
diff --git a/ext/simplexml/simplexml.c b/ext/simplexml/simplexml.c
index d26f68ee26..fdda30451d 100644
--- a/ext/simplexml/simplexml.c
+++ b/ext/simplexml/simplexml.c
@@ -356,7 +356,10 @@ long_dim:
_node_as_zval(sxe, node, rv, newtype, name, sxe->iter.nsprefix, sxe->iter.isprefix);
}
#else
- _node_as_zval(sxe, node, rv, SXE_ITER_ELEMENT, name, sxe->iter.nsprefix, sxe->iter.isprefix);
+ /* In BP_VAR_IS mode only return a proper node if it actually exists. */
+ if (type != BP_VAR_IS || sxe_find_element_by_name(sxe, node->children, (xmlChar *) name)) {
+ _node_as_zval(sxe, node, rv, SXE_ITER_ELEMENT, name, sxe->iter.nsprefix, sxe->iter.isprefix);
+ }
#endif
}
}
@@ -610,7 +613,7 @@ long_dim:
while (node) {
SKIP_TEXT(node);
- if (!xmlStrcmp(node->name, (xmlChar *)Z_STRVAL_P(member))) {
+ if (!xmlStrcmp(node->name, (xmlChar *)Z_STRVAL_P(member)) && match_ns(sxe, node, sxe->iter.nsprefix, sxe->iter.isprefix)) {
newnode = node;
++counter;
}
@@ -803,17 +806,8 @@ static int sxe_prop_dim_exists(zval *object, zval *member, int check_empty, zend
node = php_sxe_get_first_node(sxe, node);
}
node = sxe_get_element_by_offset(sxe, Z_LVAL_P(member), node, NULL);
- }
- else {
- node = node->children;
- while (node) {
- xmlNodePtr nnext;
- nnext = node->next;
- if (node->type == XML_ELEMENT_NODE && !xmlStrcmp(node->name, (xmlChar *)Z_STRVAL_P(member)) && match_ns(sxe, node, sxe->iter.nsprefix, sxe->iter.isprefix)) {
- break;
- }
- node = nnext;
- }
+ } else {
+ node = sxe_find_element_by_name(sxe, node->children, (xmlChar *)Z_STRVAL_P(member));
}
if (node) {
exists = 1;
diff --git a/ext/simplexml/tests/bug72957.phpt b/ext/simplexml/tests/bug72957.phpt
new file mode 100644
index 0000000000..29ca69fa76
--- /dev/null
+++ b/ext/simplexml/tests/bug72957.phpt
@@ -0,0 +1,16 @@
+--TEST--
+Bug #72957: Null coalescing operator doesn't behave as expected with SimpleXMLElement
+--SKIPIF--
+<?php if (!extension_loaded("simplexml")) print "skip simplexml extension is not loaded"; ?>
+--FILE--
+<?php
+
+$xml = new SimpleXMLElement('<root><elem>Text</elem></root>');
+
+echo 'elem2 is: ' . ($xml->elem2 ?? 'backup string') . "\n";
+echo 'elem2 is: ' . (isset($xml->elem2) ? $xml->elem2 : 'backup string') . "\n";
+
+?>
+--EXPECT--
+elem2 is: backup string
+elem2 is: backup string
diff --git a/ext/simplexml/tests/bug72971_2.phpt b/ext/simplexml/tests/bug72971_2.phpt
new file mode 100644
index 0000000000..aa6e09438c
--- /dev/null
+++ b/ext/simplexml/tests/bug72971_2.phpt
@@ -0,0 +1,35 @@
+--TEST--
+Bug #72971 (2): SimpleXML property write does not respect namespace
+--SKIPIF--
+<?php if (!extension_loaded("simplexml")) print "skip simplexml extension is not loaded"; ?>
+--FILE--
+<?php
+
+$xml = new SimpleXMLElement('<root xmlns:ns="ns"><foo>bar</foo><ns:foo>ns:bar</ns:foo></root>');
+
+$xml->foo = 'new-bar';
+var_dump($xml->foo);
+var_dump($xml->children('ns')->foo);
+
+$xml->children('ns')->foo = 'ns:new-bar';
+var_dump($xml->foo);
+var_dump($xml->children('ns')->foo);
+
+?>
+--EXPECT--
+object(SimpleXMLElement)#2 (1) {
+ [0]=>
+ string(7) "new-bar"
+}
+object(SimpleXMLElement)#3 (1) {
+ [0]=>
+ string(6) "ns:bar"
+}
+object(SimpleXMLElement)#3 (1) {
+ [0]=>
+ string(7) "new-bar"
+}
+object(SimpleXMLElement)#2 (1) {
+ [0]=>
+ string(10) "ns:new-bar"
+}