【问题标题】:PHP: Creating a psuedo-join method inside an objectPHP:在对象内创建伪连接方法
【发布时间】:2023-03-09 19:33:01
【问题描述】:

我正在尝试创建一个能够处理类似查询的条件语句的对象。这样我就可以将两个条件“连接”在一起,以根据所使用的“连接”类型在它们之间创建依赖关系。我目前有一个包含以下方法的简单对象:

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

然后,这将生成指定第三个条件的结果将反向链接以影响第一个条件的结果所需的逻辑。

在示例中,让我们说:

条件_1 = 苹果是红色的 condition_2 = 苹果成熟了 condition_3 = 苹果是金冠

使用这个我应该假设如果我要传递一个成熟的、红色和金色的美味苹果,那么 validate() 的结果将是错误的。该方法应该失败,因为 condition_3 的“加入”不是。

但是,目前还没有办法告诉代码整个方法的结果取决于前一个条件的结果以及它与它的连接方式。

非常感谢任何帮助!谢谢。

【问题讨论】:

    标签: php oop logic conditional


    【解决方案1】:

    将逻辑放在您的 Condition 子类中。

    创建一个 Condition_And 类,该类接受两个(或更多) Condition 对象,并且只有当它们都为真时才返回真。

    创建一个 Condition_Or 类,该类接受两个(或更多)条件对象,如果任何一个为真,则返回假。

    如果您认为有必要,请创建一个 Condition_Not 类(Apple 不是 Golden Delicious)。

    将这些串在一起应该可以得到您正在寻找的任何查询。由于它们都是同一类型的子类,因此您可以构建它们,将 NOT 放在 OR 中,将 AND 放在 OR 中,以此类推。

    【讨论】:

      【解决方案2】:

      涉及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;
      

      【讨论】:

        猜你喜欢
        • 2017-04-17
        • 2017-01-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-12-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多