DOMXPath::registerPhpFunctions

Register PHP functions as XPath functions

&reftitle.description; public `void` `DOMXPath::registerPhpFunctions` ``string``array``null```restrict`&null;

This method enables the ability to use PHP functions within XPath expressions.

&reftitle.parameters;

`restrict`

- Use this parameter to only allow certain functions to be called from XPath.

  This parameter can be one of the following: a `string` (a function name), an indexed `array` of function names, or an associative `array` with keys being the function name and the associated value being the `callable`.

&reftitle.returnvalues;

&return.void;

&reftitle.changelog;

&Version; | &Description;
8.4.0 | It is now possible to use `callable`s for callbacks when using `restrict` with `array` entries.

&reftitle.examples;

The following examples use `book.xml` which contains the following:

### book.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <books>
     <book>
      <title>PHP Basics</title>
      <author>Jim Smith</author>
      <author>Jane Smith</author>
     </book>
     <book>
      <title>PHP Secrets</title>
      <author>Jenny Smythe</author>
     </book>
     <book>
      <title>XML basics</title>
      <author>Joe Black</author>
     </book>
    </books>

### `DOMXPath::registerPHPFunctions` with `php:functionString`

    <?php
    $doc = new DOMDocument;
    $doc->load('book.xml');

    $xpath = new DOMXPath($doc);

    // Register the php: namespace (required)
    $xpath->registerNamespace("php", "http://php.net/xpath");

    // Register PHP functions (no restrictions)
    $xpath->registerPHPFunctions();

    // Call substr function on the book title
    $nodes = $xpath->query('//book[php:functionString("substr", title, 0, 3) = "PHP"]');

    echo "Found {$nodes->length} books starting with 'PHP':\n";
    foreach ($nodes as $node) {
        $title  = $node->getElementsByTagName("title")->item(0)->nodeValue;
        $author = $node->getElementsByTagName("author")->item(0)->nodeValue;
        echo "$title by $author\n";
    }

    ?>

&example.outputs.similar;

    Found 2 books starting with 'PHP':
    PHP Basics by Jim Smith
    PHP Secrets by Jenny Smythe

### `DOMXPath::registerPHPFunctions` with `php:function`

    <?php
    $doc = new DOMDocument;
    $doc->load('book.xml');

    $xpath = new DOMXPath($doc);

    // Register the php: namespace (required)
    $xpath->registerNamespace("php", "http://php.net/xpath");

    // Register PHP functions (has_multiple only)
    $xpath->registerPHPFunctions("has_multiple");

    function has_multiple($nodes) {
        // Return true if more than one author
        return count($nodes) > 1;
    }
    // Filter books with multiple authors
    $books = $xpath->query('//book[php:function("has_multiple", author)]');

    echo "Books with multiple authors:\n";
    foreach ($books as $book) {
        echo $book->getElementsByTagName("title")->item(0)->nodeValue . "\n";
    }

    ?>

&example.outputs.similar;

    Books with multiple authors:
    PHP Basics

### `DOMXPath::registerPHPFunctions` with a `callable`

    <?php
    $doc = new DOMDocument;
    $doc->load('book.xml');

    $xpath = new DOMXPath($doc);

    // Register the php: namespace (required)
    $xpath->registerNamespace("php", "http://php.net/xpath");

    // Register PHP functions (has_multiple only)
    $xpath->registerPHPFunctions(["has_multiple" => fn ($nodes) => count($nodes) > 1]);

    // Filter books with multiple authors
    $books = $xpath->query('//book[php:function("has_multiple", author)]');

    echo "Books with multiple authors:\n";
    foreach ($books as $book) {
        echo $book->getElementsByTagName("title")->item(0)->nodeValue . "\n";
    }

    ?>

&example.outputs.similar;

    Books with multiple authors:
    PHP Basics

&reftitle.seealso;

- `DOMXPath::registerNamespace`
- `DOMXPath::query`
- `DOMXPath::evaluate`
- `XSLTProcessor::registerPHPFunctions`