Задать вопрос
@romicohen
Системный Архитектор

Зачем в обычном проекте может понадобиться использование __invoke?

Я прочитал ответа на подобный же вопрос: Зачем нужен __invoke и когда его нужно использовать? - но как по мне - это и не ответы вовсе, потому что они отвечают на вопрос "Как?", но не отвечают на вопрос "Зачем?".

У меня и раньше этот вопрос возникал, но сейчас возник снова, когда я ковырял Laravel Sanctum. Там Guard вызывается через __invoke.

А в чем тут соль-то? Можно ведь и без __invoke всё сделать?

Зачем нужно использовать лишнюю сущность, если можно ее не использовать?

Хочу понять, потому что - а вдруг это как-то удобно?
  • Вопрос задан
  • 858 просмотров
Подписаться 3 Простой Комментировать
Решения вопроса 1
Maksclub
@Maksclub Куратор тега PHP
maksfedorov.ru
__invoke() метод позволяет превратить объект в функцию, которую мы можем передавать/получать/резовлить через псевдо-тип callable.
Этакий элемент функционального программирования.

Хорошо подходит там, где мы выстраиваем pipe или reduce, для описания которых ФП подход является наиболее выразительным и лаконичным. Не знаком с архитектурой Ларавел, но могу предположить, что для авторизации прорисовывается некоторый пайплайн, где можно выполнять разные пайпы или фильтры для првоерки/валидации или чего-либо именно с таким подходом и это более лаконично...

Пример:
public function add(callable $pipe) {
    //..
}

...

$pipeline = (new Pipeline)
     ->add(fn() => true)
     ->add(fn(bool $enabled) =>'Maks enabled')
     ->add(new MaksHandler()) // тут класс с методом __invoke и работает как анонимка
;
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@romicohen Автор вопроса
Системный Архитектор
Ответ от Vitsliputsli

Правильно, что не поняли, т.к. вам никто и не ответил.
Совершенно верно, можно просто указать метод, там где тип callable, и разницы нет никакой.
А можно как, выше написал Лентюй, просто вызвать метод класса, а его необходимость описать в интерфейсе без всяких callable вовсе.
Если вы используете ООП, то invoke вам не нужен, оперируйте объектами, а не функциями, и не мутантами вида "объект как функция".
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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