Может ли метод Fluent Interface в PHP определить, где он находится в цепочке?

Я думаю о создании класса, который использует цепочку методов. То, чего я пытаюсь достичь, это тип вывода методов, основанный на том, связаны ли методы или нет.

Пример 1:

$var = $instance->user($id);

Возвращает массив с необходимой информацией.

Пример 2:

$var = $instance->user($id)->action($arg);

Я хочу цепной метод перед user() просто передать аргумент $id к следующему методу и для него ничего не выводить. Тогда метод action() хватает $id и вернуть то, что просили.

Как мне этого добиться?

Причину, по которой я хочу, не хочу объяснять user() вернуть его нормальный код результата, потому что я намерен использовать это в оболочке API. Возвращая «нормальный» user() будет стоить мне дополнительно X-Rate-Limit вызов. Если бы я мог сэкономить этот вызов, и просто передать параметр $id ко второму методу это было бы идеальным.

0

Решение

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

Хорошее решение для этого — использовать цепочечные методы для установки параметров, а затем запустить метод execute в конце. Итак, вы можете изменить ваши примеры следующим образом:

$var = $instance->user($id)->execute();
$var = $instance->user($id)->action($arg)->execute();

Вы бы имели user() а также action() возврате $this (а также изменение состояния экземпляра каким-либо образом), а затем execute() будет запускать HTTP-вызов за один раз. Это делает все звонки до последнего действительно очень недорогими.

Возвращаемое значение мог быть $thisхотя метод-терминатор такого типа может просто возвращать логическое значение успеха. Ваши примеры подразумевают, что ожидается значение — имеющее отношение к последнему методу до execute() вероятно, будет работать тоже.

1

Другие решения

Вместо того, чтобы возвращать массив, user () должен возвращать объект User.

Сюда, $var = $instance->user($id); вернет нужную вам информацию (потому что вся информация будет в объекте User) и $var = $instance->user($id)->action($arg); вызовет action () для объекта User (таким образом, вы можете легко получить доступ к идентификатору пользователя).

Больше не нужно различать, как вызывается user (). 😉

0

По вопросам рекламы [email protected]