Динамическое построение вызовов функций в стеке

Я использую PHP (с KirbyCMS) и могу создать этот код:

$results = $site->filterBy('a_key', 'a_value')->filterBy('a_key2', 'a_value2');

Это цепь с двумя filterBy, Оно работает.

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

Как это сделать?

Может быть, вы можете играть с этим кодом?

Цепочка — это просто случайное число, которое можно использовать для создания от 1 до 5 цепочек.

for( $i = 0; $i < 10; $i ++ ) {
$chains = rand(1, 5);
}

Примеры желаемого результата

Пример первый, только один вызов функции

$results = $site->filterBy('a_key', 'a_value');

Пример два, много вызовов вложенных функций

$results = $site->filterBy('a_key', 'a_value')->filterBy('a_key2', 'a_value2')->filterBy('a_key3', 'a_value3')->filterBy('a_key4', 'a_value4')->filterBy('a_key5', 'a_value5')->filterBy('a_key6', 'a_value6');

1

Решение

$chains = rand(1, 5)
$results = $site
$suffix = ''
for ( $i = 1; $i <= $chains; $i ++) {
if ($i != 1) {
$suffix = $i
}
$results = $results->filterBy('a_key' . $suffix, 'a_value' . $suffix)
}

Если вы можете пройти 'a_key1' а также 'a_value1' на первый звонок filterBy вместо 'a_key' а также 'a_value'Вы можете упростить код, удалив $suffix и if блокировать и просто добавлять $i,

1

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

Вам не нужно генерировать список связанных вызовов. Вы можете поместить аргументы каждого вызова в список, а затем написать новый метод класса, который получает их из списка и использует их для вызова filterBy() несколько раз.

Я предполагаю из вашего примера кода, что функция filterBy() возвращается $this или другой объект того же класса, что и site,

//
// The code that generates the filtering parameters:

// Store the arguments of the filtering here
$params = array();

// Put as many sets of arguments you need
// use whatever method suits you best to produce them
$params[] = array('key1', 'value1');
$params[] = array('key2', 'value2');
$params[] = array('key3', 'value3');


//
// Do the multiple filtering
$site = new Site();
$result = $site->filterByMultiple($params);


//
// The code that does the actual filtering
class Site {
public function filterByMultiple(array $params) {
$result = $this;
foreach ($params as list($key, $value)) {
$result = $result->filterBy($key, $value);
}
return $result;
}
}

Если filterBy() возвращается $this тогда вам не нужна рабочая переменная $result; вызов $this->filterBy() а также return $this; и удалить другие вхождения $result,

1

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