--TEST-- DOMXPath Tests --EXTENSIONS-- dom --FILE-- textContent; } if ($val > 0) { return $val/$count; } else { return 0; } } $dom = new DOMDocument; $dom->loadXML('myval'); $xpath = new DOMXPath($dom); $xpath->registerPHPFunctions('MyAverage'); $xpath->registerNamespace("php", "http://php.net/xpath"); $xpath->registerNamespace("def", "urn::default"); $nodelist = $xpath->query("//def:child"); if ($node = $nodelist->item(0)) { print $node->textContent."\n"; } $count = $xpath->evaluate("count(//def:child)"); var_dump($count); $xpathdoc = $xpath->document; var_dump($xpathdoc instanceof DOMDocument); $root = $dom->documentElement; $root->appendChild($dom->createElementNS("urn::default", "testnode", 3)); $root->appendChild($dom->createElementNS("urn::default", "testnode", 4)); $root->appendChild($dom->createElementNS("urn::default", "testnode", 4)); $root->appendChild($dom->createElementNS("urn::default", "testnode", 5)); $avg = $xpath->evaluate('number(php:function("MyAverage", //def:testnode))'); var_dump($avg); try { $xpath->registerPHPFunctions('non_existent'); $avg = $xpath->evaluate('number(php:function("non_existent", //def:testnode))'); } catch (\Error $e) { echo $e->getMessage() . \PHP_EOL; } try { $xpath->registerPhpFunctions(['non_existant']); $avg = $xpath->evaluate('number(php:function("non_existent", //def:testnode))'); } catch (\Error $e) { echo $e->getMessage() . \PHP_EOL; } ?> --EXPECT-- myval float(1) bool(true) float(4) DOMXPath::registerPhpFunctions(): Argument #1 ($restrict) must be a callable, function "non_existent" not found or invalid function name DOMXPath::registerPhpFunctions(): Argument #1 ($restrict) must be an array with valid callbacks as values, function "non_existant" not found or invalid function name