2009-03-13 3 views
0

クエリのような条件文を処理できるオブジェクトを作成しようとしています。これは、2つの条件を一緒に「結合」して、使用されている「結合」のタイプに基づいてそれらの間の依存関係を作成することができるためです。PHP:オブジェクト内に疑似結合メソッドを作成する

public function addCondition (Condition $condition, $join = null) 
{ 
    $this->conditions[] = $condition; 
} 

public function validate () 
{ 
    foreach ($this->conditions as $condition) 
    { 
     $result = $condition->validate(); 
     [...] 
    } 
} 

問題は、私は条件付きでvalidateメソッドの戻り値に影響を与える二つの文の間に結合を実行できるようにする必要があり、次のとおりです。私は現在、次のメソッドが含まれている単純なオブジェクトを持っています。

$this->addCondition($condition_1); 
$this->addCondition($condition_2, 'AND'); 
$this->addCondition($condition_3, 'NOT'); 

これは、第3の条件の結果は後方チェーンは、最初の条件の結果に影響を与えるようにすることを指定するために必要なロジックを生成します:アイデアは、次のように条件を供給することができることです。

 
condition_1 = Apple is Red 
condition_2 = Apple is Ripe 
condition_3 = Apple is Golden Delicious 

を、これは私は、熟した、赤と金色のおいしいリンゴ、検証の結果を渡すようにした場合は()がfalseになることを想定する必要があり使用:

は一例では、言うことができます。 condition_3の 'join'がNOTであるため、このメソッドは失敗します。

しかし、現時点では、メソッド全体の結果は前の条件の結果とそれが結合される方法によって決まることをコードに伝える方法はありません。

ご協力いただきありがとうございます。ありがとう。

答えて

1

条件サブクラスにロジックを配置します。

2つ(またはそれ以上)のConditionオブジェクトをとり、両方がtrueの場合にのみtrueを返すCondition_Andクラスを作成します。

2つ(以上)のConditionオブジェクトをとり、trueがあればfalseを返すCondition_Orクラスを作成します。

必要があると感じる場合は、Condition_Notクラスを作成します(AppleはGolden Deliciousではありません)。

これらを一緒にストリングすると、探しているクエリがすべて得られます。それらはすべて同じタイプのサブクラスなので、ORの内部のORの内部にNOTを入れてそれらを構築することができます。

0

ANDORの両方を含む条件は、本質的に入れ子になっています。あなたのクラスはこれを表現する方法を持っていないようです。

ネスティングは、条件がすべてANDで結合されるか、またはすべてがORで結合される必要があることを意味しません。いずれにしても、同時に使用することはできません。ご例えば

ANDはそうあなたが必要とするすべては、各条件についてNOTフラグであり、自然な選択と思われる:

$this->addCondition($condition_1, true); // e.g.: must be true to succeed 
$this->addCondition($condition_2, true); 
$this->addCondition($condition_3, false); // e.g.: must be false to succeed 

あなたはその後、どうなる:

$valid = true; 

foreach ($this->conditions as $condition) 
{ 
    $valid = $valid && $condition->validate(); 
    if (!$valid) 
    { 
    // react to "validation failed at $condition" 
    } 
} 

return $valid; 
関連する問題