1

私は PHP (KirbyCMS を使用) を使用しており、次のコードを作成できます。

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

こちらはチェーン2本付きfilterByです。できます。

ただし、このような関数呼び出しを動的に作成する必要があります。場合によっては、2 つの連鎖した関数呼び出しになることもあれば、3 つ以上になることもあります。

それはどのように行われますか?

多分あなたはこのコードで遊ぶことができますか?

chain は、1 ~ 5 個のチェーンを作成するために使用できる単なる乱数です。

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

望ましい結果の例

例 1、関数呼び出しは 1 つだけ

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

例 2、多くのネストされた関数呼び出し

$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');
4

2 に答える 2

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()andを呼び出してreturn $this;、 の他のオカレンスを削除し$resultます。

于 2015-05-15T14:26:18.173 に答える