在 PHP 中动态构建链式函数调用
Building chained function calls dynamically in PHP
我使用 PHP(与 KirbyCMS)并可以创建此代码:
$results = $site->filterBy('a_key', 'a_value')->filterBy('a_key2', 'a_value2');
这是一个有两个 filterBy
的链。有效。
但是我需要像这样动态地构建一个函数调用。有时它可以是两个链式函数调用,有时是三个或更多。
这是怎么做到的?
也许你可以玩这个代码?
chain 只是一个随机数,可用于创建 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');
$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
.
来编写代码
您不需要生成链式调用列表。您可以将每个调用的参数放在一个列表中,然后编写 class 的一个新方法,从列表中获取它们并使用它们重复调用 filterBy()
。
我从您的示例代码中假设函数 filterBy()
returns $this
或与 site
.[=21= 具有相同 class 的另一个对象]
//
// 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()
returns $this
那么你不需要工作变量$result
;调用 $this->filterBy()
和 return $this;
并删除其他出现的 $result
.
我使用 PHP(与 KirbyCMS)并可以创建此代码:
$results = $site->filterBy('a_key', 'a_value')->filterBy('a_key2', 'a_value2');
这是一个有两个 filterBy
的链。有效。
但是我需要像这样动态地构建一个函数调用。有时它可以是两个链式函数调用,有时是三个或更多。
这是怎么做到的?
也许你可以玩这个代码?
chain 只是一个随机数,可用于创建 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');
$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
.
您不需要生成链式调用列表。您可以将每个调用的参数放在一个列表中,然后编写 class 的一个新方法,从列表中获取它们并使用它们重复调用 filterBy()
。
我从您的示例代码中假设函数 filterBy()
returns $this
或与 site
.[=21= 具有相同 class 的另一个对象]
//
// 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()
returns $this
那么你不需要工作变量$result
;调用 $this->filterBy()
和 return $this;
并删除其他出现的 $result
.