Если вы используете XSLT 2.0, укажите xpath-default-namespace="http://www.example.com"
в разделе stylesheet
.
Этот ответ немного устарел, так как был написан в 2009. Пожалуйста, отнеситесь к нему с недоверием.
PHP не позволяет передавать указатели на функции, как другие языки. Функции не являются первым классом в PHP. Функции первого класса в основном означают, что вы можете сохранить функцию в переменной, передать ее и выполнить в любое время.
Метод __ invoke
- это способ, которым PHP может поддерживать псевдопервый - функции класса.
Метод __ invoke
может использоваться для передачи класса, который может действовать как закрытие или продолжение , или просто как функция, которая вы можете обойтись.
Многое из функционального программирования полагается на функции первого класса. От этого может выиграть даже обычное императивное программирование.
Допустим, у вас есть процедура сортировки, но хотел поддерживать разные функции сравнения. Что ж, у вас могут быть разные классы сравнения, которые реализуют функцию __invoke и передают экземпляры классу в вашу функцию сортировки, и ей даже не нужно знать имя функции.
На самом деле, вы всегда могли это сделать. что-то вроде передачи класса и вызова функции методом, но теперь вы можете почти говорить о передаче «функции» вместо передачи класса, хотя это не так чисто, как в других языках.
Обычно я вижу магический метод __invoke () {...} как отличную возможность абстрагироваться от использования основных функций объекта класса или для интуитивной настройки объекта (подготовка объект перед использованием его методов).
Случай 1 - Например, допустим, что я использую какой-то сторонний объект, который реализует магический метод __invoke, предоставляя таким образом легкий доступ к основным функциям экземпляра объекта. Чтобы использовать его, мне нужно только знать, какие параметры ожидает метод __invoke и каков будет конечный результат этой функции (замыкание). Таким образом, я могу использовать основные функциональные возможности объекта класса без особых усилий, чтобы расширить возможности объекта (обратите внимание, что в этом примере нам не нужно знать или использовать любое имя метода).
Абстрагируясь от реального кода ...
вместо
$obj->someFunctionNameInitTheMainFunctionality($arg1, $arg2);
мы теперь используем:
$obj($arg1, $arg2);
Теперь мы можем также передать объект другому функции, которые ожидают, что ее параметры будут вызываться так же, как и в обычной функции:
вместо
someFunctionThatExpectOneCallableArgument($someData, [get_class($obj), 'someFunctionNameInitTheMainFunctionality']);
мы теперь используем:
someFunctionThatExpectOneCallableArgument($someData, $obj);
__ invoke также предоставляет хороший ярлык использования, так почему бы не использовать его?
Я считаю, что эта функция существует в основном для поддержки новой функции закрытия 5.3. Замыкания представлены как экземпляры класса Closure
и могут быть вызваны напрямую, например, $ foo = $ someClosure ();
. Практическое преимущество __ invoke ()
заключается в том, что становится возможным создать стандартный тип обратного вызова вместо использования странных комбинаций строк, объектов и массивов в зависимости от того, ссылаетесь ли вы на функцию, метод экземпляра или статический метод.
Это комбинация двух вещей. Вы уже правильно определили одного из них. Это действительно похоже на интерфейс Java IRunnable
, где каждый "исполняемый" объект реализует один и тот же метод. В Java этот метод называется run
; в PHP метод называется __ invoke
, и вам не нужно заранее явно реализовывать какой-либо конкретный тип интерфейса.
Второй аспект - это синтаксический сахар , поэтому вместо вызывая $ obj -> __ invoke ()
, вы можете пропустить имя метода, чтобы он выглядел так, как будто вы вызываете объект напрямую: $ obj ()
.
ключевая часть закрытия PHP - первая. Языку нужен некий установленный метод для вызова закрывающего объекта, чтобы заставить его делать свое дело.