PHP 5.3 Магический метод __invoke

Если вы используете XSLT 2.0, укажите xpath-default-namespace="http://www.example.com" в разделе stylesheet.

21
задан Community 23 May 2017 в 11:47
поделиться

4 ответа

Этот ответ немного устарел, так как был написан в 2009. Пожалуйста, отнеситесь к нему с недоверием.

PHP не позволяет передавать указатели на функции, как другие языки. Функции не являются первым классом в PHP. Функции первого класса в основном означают, что вы можете сохранить функцию в переменной, передать ее и выполнить в любое время.

Метод __ invoke - это способ, которым PHP может поддерживать псевдопервый - функции класса.

Метод __ invoke может использоваться для передачи класса, который может действовать как закрытие или продолжение , или просто как функция, которая вы можете обойтись.

Многое из функционального программирования полагается на функции первого класса. От этого может выиграть даже обычное императивное программирование.

Допустим, у вас есть процедура сортировки, но хотел поддерживать разные функции сравнения. Что ж, у вас могут быть разные классы сравнения, которые реализуют функцию __invoke и передают экземпляры классу в вашу функцию сортировки, и ей даже не нужно знать имя функции.

На самом деле, вы всегда могли это сделать. что-то вроде передачи класса и вызова функции методом, но теперь вы можете почти говорить о передаче «функции» вместо передачи класса, хотя это не так чисто, как в других языках.

29
ответ дан 28 November 2019 в 04:25
поделиться

Заключение (на основе всего вышеперечисленного)

Обычно я вижу магический метод __invoke () {...} как отличную возможность абстрагироваться от использования основных функций объекта класса или для интуитивной настройки объекта (подготовка объект перед использованием его методов).

Случай 1 - Например, допустим, что я использую какой-то сторонний объект, который реализует магический метод __invoke, предоставляя таким образом легкий доступ к основным функциям экземпляра объекта. Чтобы использовать его, мне нужно только знать, какие параметры ожидает метод __invoke и каков будет конечный результат этой функции (замыкание). Таким образом, я могу использовать основные функциональные возможности объекта класса без особых усилий, чтобы расширить возможности объекта (обратите внимание, что в этом примере нам не нужно знать или использовать любое имя метода).

Абстрагируясь от реального кода ...

вместо

$obj->someFunctionNameInitTheMainFunctionality($arg1, $arg2);

мы теперь используем:

$obj($arg1, $arg2);

Теперь мы можем также передать объект другому функции, которые ожидают, что ее параметры будут вызываться так же, как и в обычной функции:

вместо

someFunctionThatExpectOneCallableArgument($someData, [get_class($obj), 'someFunctionNameInitTheMainFunctionality']);

мы теперь используем:

someFunctionThatExpectOneCallableArgument($someData, $obj);

__ invoke также предоставляет хороший ярлык использования, так почему бы не использовать его?

1
ответ дан Antoine 23 May 2017 в 11:47
поделиться

Я считаю, что эта функция существует в основном для поддержки новой функции закрытия 5.3. Замыкания представлены как экземпляры класса Closure и могут быть вызваны напрямую, например, $ foo = $ someClosure (); . Практическое преимущество __ invoke () заключается в том, что становится возможным создать стандартный тип обратного вызова вместо использования странных комбинаций строк, объектов и массивов в зависимости от того, ссылаетесь ли вы на функцию, метод экземпляра или статический метод.

14
ответ дан 28 November 2019 в 04:25
поделиться

Это комбинация двух вещей. Вы уже правильно определили одного из них. Это действительно похоже на интерфейс Java IRunnable , где каждый "исполняемый" объект реализует один и тот же метод. В Java этот метод называется run ; в PHP метод называется __ invoke , и вам не нужно заранее явно реализовывать какой-либо конкретный тип интерфейса.

Второй аспект - это синтаксический сахар , поэтому вместо вызывая $ obj -> __ invoke () , вы можете пропустить имя метода, чтобы он выглядел так, как будто вы вызываете объект напрямую: $ obj () .

ключевая часть закрытия PHP - первая. Языку нужен некий установленный метод для вызова закрывающего объекта, чтобы заставить его делать свое дело.

3
ответ дан 28 November 2019 в 04:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: