Регистрирует PHP-функции как XPath-функции

# DOMXPath::registerPhpFunctions

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

DOMXPath::registerPhpFunctions — Регистрирует PHP-функции как XPath-функции

### Описание

public function DOMXPath::registerPhpFunctions(string|array|null `$restrict` = `null`): void

Метод разрешает вызывать PHP-функции в XPath-выражениях.

### Список параметров

`restrict`

  Параметр разрешает вызывать в XPath-выражениях только конкретные функции.

  Параметр принимает значения следующих типов: string — название функции, array — индексный массив с названиями функций или array — ассоциативный массив с названиями функций в ключах и callable-выражениями в значениях.

### Возвращаемые значения

Функция не возвращает значения после выполнения.

### Ошибки

- Метод выбрасывает ошибку ValueError, если название callback-функции недопустимо.
- Метод выбрасывает ошибку ValueError, если аргумент `options` содержит недопустимые параметры.
- Метод выбрасывает ошибку ValueError, если в аргументе `overrideEncoding` передали неизвестную кодировку.
- Метод выбрасывает ошибку TypeError, если значение для обратного вызова не принадлежит типу callable.

### Список изменений

Версия | Описание
--- | ---
8.4.0 | При передаче недопустимых названий callback-функций метод теперь выбрасывает ошибку ValueError. При передаче значений, которые не принадлежат типу callable, метод теперь выбрасывает ошибку TypeError.
8.4.0 | Параметр `restrict` теперь принимает callable-выражения, когда набор callback-функций, доступных для вызова из XPath-выражений, ограничивают путём передачи массива (array).

### Примеры

Примеры на этой странице работают с файлом book.xml, который содержит следующее:

Пример #1 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>

Пример #2 Пример регистрации PHP-функции как XPath-функции методом DOMXPath::registerPhpFunctions() и вызова функции через синтаксис `php:functionString`

    <?php

    $doc = new DOMDocument();
    $doc->load('examples/book-simple.xml');

    $xpath = new DOMXPath($doc);

    // Обязательная регистрация пространства имён с префиксом 'php'
    $xpath->registerNamespace("php", "http://php.net/xpath");

    // Регистрация PHP-функций без установки ограничений
    $xpath->registerPhpFunctions();

    // Вызов функции substr на названии книги
    $nodes = $xpath->query('//book[php:functionString("substr", title, 0, 3) = "PHP"]');

    echo "Метод нашёл {$nodes->length} книги, название которых начинается с 'PHP':\n";
    foreach ($nodes as $node) {
        $title  = $node->getElementsByTagName("title")->item(0)->nodeValue;
        $author = $node->getElementsByTagName("author")->item(0)->nodeValue;
        echo "$title автора $author\n";
    }

    ?>

Вывод приведённого примера будет похож на:

    Метод нашёл 2 книги, название которых начинается с 'PHP':
    PHP Basics автора Jim Smith
    PHP Secrets автора Jenny Smythe

Пример #3 Пример регистрации PHP-функции как XPath-функции методом DOMXPath::registerPhpFunctions() и вызова функции через синтаксис `php:function`

    <?php

    $doc = new DOMDocument();
    $doc->load('examples/book-simple.xml');

    $xpath = new DOMXPath($doc);

    // Обязательная регистрация пространства имён с префиксом 'php'
    $xpath->registerNamespace("php", "http://php.net/xpath");

    // Регистрация PHP-функций с установкой ограничения только на доступ к функции has_multiple
    $xpath->registerPhpFunctions("has_multiple");

    function has_multiple($nodes) {
        // Функция возвращает true, если список узлов содержит больше одного автора
        return count($nodes) > 1;
    }
    // Фильтрация книг, которые вышли в соавторстве
    $books = $xpath->query('//book[php:function("has_multiple", author)]');

    echo "Книги, которые написали два или больше автора:\n";
    foreach ($books as $book) {
        echo $book->getElementsByTagName("title")->item(0)->nodeValue . "\n";
    }

    ?>

Вывод приведённого примера будет похож на:

    Книги, которые написали два или больше автора:
    PHP Basics

Пример #4 Пример регистрации анонимной PHP-функции как XPath-функции методом DOMXPath::registerPhpFunctions() с установкой ограничения через массив callable-значений

    <?php

    $doc = new DOMDocument();
    $doc->load('examples/book-simple.xml');

    $xpath = new DOMXPath($doc);

    // Обязательная регистрация пространства имён с префиксом 'php'
    $xpath->registerNamespace("php", "http://php.net/xpath");

    // Регистрация PHP-функций с установкой ограничения только на доступ к функции has_multiple
    $xpath->registerPhpFunctions(["has_multiple" => fn ($nodes) => count($nodes) > 1]);

    // Фильтрация книг, которые вышли в соавторстве
    $books = $xpath->query('//book[php:function("has_multiple", author)]');

    echo "Книги, которые написали два или больше автора:\n";
    foreach ($books as $book) {
        echo $book->getElementsByTagName("title")->item(0)->nodeValue . "\n";
    }

    ?>

Вывод приведённого примера будет похож на:

    Книги, которые написали два или больше автора:
    PHP Basics

### Смотрите также

- DOMXPath::registerNamespace() - Регистрирует пространство имён с объектом DOMXPath
- DOMXPath::query() - Вычисляет XPath-выражение
- DOMXPath::evaluate() - Вычисляет XPath-выражение и возвращает типизированный результат, если возможно
- XSLTProcessor::registerPHPFunctions() - Разрешает вызывать PHP-функции как XSLT-функции

`↑` and `↓` to navigate • `Enter` to select • `Esc` to close • `/` to open