Я думаю о создании класса, который использует цепочку методов. То, чего я пытаюсь достичь, это тип вывода методов, основанный на том, связаны ли методы или нет.
$var = $instance->user($id);
Возвращает массив с необходимой информацией.
$var = $instance->user($id)->action($arg);
Я хочу цепной метод перед user()
просто передать аргумент $id
к следующему методу и для него ничего не выводить. Тогда метод action()
хватает $id
и вернуть то, что просили.
Как мне этого добиться?
Причину, по которой я хочу, не хочу объяснять user()
вернуть его нормальный код результата, потому что я намерен использовать это в оболочке API. Возвращая «нормальный» user()
будет стоить мне дополнительно X-Rate-Limit
вызов. Если бы я мог сэкономить этот вызов, и просто передать параметр $id
ко второму методу это было бы идеальным.
Ваш текущий план состоит в том, чтобы каждый из ваших методов выполнял дорогостоящий HTTP-вызов, но вы знаете, что существует вероятность существенной задержки при подключении нескольких методов.
Хорошее решение для этого — использовать цепочечные методы для установки параметров, а затем запустить метод execute в конце. Итак, вы можете изменить ваши примеры следующим образом:
$var = $instance->user($id)->execute();
$var = $instance->user($id)->action($arg)->execute();
Вы бы имели user()
а также action()
возврате $this
(а также изменение состояния экземпляра каким-либо образом), а затем execute()
будет запускать HTTP-вызов за один раз. Это делает все звонки до последнего действительно очень недорогими.
Возвращаемое значение мог быть $this
хотя метод-терминатор такого типа может просто возвращать логическое значение успеха. Ваши примеры подразумевают, что ожидается значение — имеющее отношение к последнему методу до execute()
вероятно, будет работать тоже.
Вместо того, чтобы возвращать массив, user () должен возвращать объект User.
Сюда, $var = $instance->user($id);
вернет нужную вам информацию (потому что вся информация будет в объекте User) и $var = $instance->user($id)->action($arg);
вызовет action () для объекта User (таким образом, вы можете легко получить доступ к идентификатору пользователя).
Больше не нужно различать, как вызывается user (). 😉