【问题标题】:calculator with pattern in php带有 php 模式的计算器
【发布时间】:2020-10-16 14:18:42
【问题描述】:

我如何创建一个类计算器,女巫可以执行不同的操作,例如:加法,乘法,但使用这种格式 $test->two()->add()->one() ==> 结果是 3 .

Can you help me ?

thank you 


class Test 
{
    private $result;
    function __construct()
    {
        $this->result = 0;
    }
    
    function one()
    {
        $this->result = 1;
        return $this;
    }
    
    function two()
    {
        $this->result = 2;
        return $this;
    }
    
    function add()
    {
        $this->result += $this->result;
        return $this;
    }
    
    function getResult()
    {
        return $this->result;
    }
}

$test = new Test();
$a = $test->One()->add()->two();
var_dump($a->getResult());

I did this programm but i didn't had the correct response 

the result returned is 2 but i must have 3 (1+2)

【问题讨论】:

  • 您可以使用:2 + 1。这也将导致 3。这不是更简单吗?
  • 感谢 Kiko 的回复,但我对这种格式有一个测试要做,我不知道该怎么做。
  • 好的,你还在学习。好吧,数字和运算符是类的方法。这些方法需要返回$this,以便它们可以被链接。在课堂上,您需要维护计算器的状态。等等。这些提示有帮助吗?
  • 我该怎么做?你能给我举个例子吗?
  • $this->result = 2; 将结果设置为正好两个。这会覆盖任何以前的值。这样做没有任何意义。而且 add() 位也没有任何意义,因为您 a) 试图将结果添加到 itself,并且 b) 通过您想要的逻辑,您甚至不知道要添加的第二件事是,因为您尚未指定 two() 调用。这是我说 ->one(), ->two() 的东西不起作用的另一个原因。我知道你想制作某种“可读”的语法,但实际的逻辑是完全倒退且不可行的。

标签: php design-patterns


【解决方案1】:

这里有一个解决方案。

它的工作原理是add()subtract() 不直接执行任何工作,它只是设置一个“待处理”操作,以及one()two()(我有那个风格的快捷方式到key($num) 虽然为了简单起见,我认为它更好更灵活)实际上使用输入中指定的数字执行add()subtract() 指定的最后一个操作。

它通过使用 PHP 的能力来指定使用字符串值调用的函数来工作。有点hacky,但它似乎工作。

class Calculator 
{
    private $result;
    private $nextOp;
    
    function __construct()
    {
        $this->result = 0;
        $this->nextOp = "addVal";
    }
    
    function key($num)
    {
        $this->{$this->nextOp}($num);
        return $this;
    }
    
    function add()
    {
        $this->nextOp = "addVal";
        return $this;
    }
    
    function subtract()
    {
        $this->nextOp = "subtractVal";
        return $this;
    }
    
    private function addVal($num)
    {
        $this->result += $num;
    }
    
    private function subtractVal($num)
    {
        $this->result -= $num;
    }

    function result()
    {
        return $this->result;
    }
}

$test = new Calculator();
$a = $test->key(1)->add()->key(2)->key(3)->subtract()->key(2)->result();
var_dump($a);

这会输出4

注意它假设如果你写了例如key(1)->add()->key(2)->key(2) 第二次调用key(2) 也会执行add,因为这是指定的最后一个操作(因此在这种情况下,结果将是5),并且初始操作始终是add好吧(虽然我猜你可以允许在构造函数中指定它)。我不知道这些假设在你的场景中是否可以接受,你没有指定如果用户写这样的东西会发生什么,或者类应该如何处理初始值。

现场演示:http://sandbox.onlinephpfunctions.com/code/0be629f803261c35017ae49a51fa24385978568d

【讨论】:

    【解决方案2】:

    这是我的回应。效果很好

    // Interface des opérations
    interface Operation {
        public function plus();
        public function minus();
        public function divededInto();
        public function  times();
        public function doOperation($value);
    }
    // Class Calculator 
    class Calculator implements Operation {
        private $result;
        private $operation;
        private $numbers;
            public function __construct($numbers) {
            $this->numbers = $numbers;
            $this->result = 0;
            $this->operation = null;
        }
       //Surcharge de la méthode __call
        public function __call($name, $arguments){
            $name = strtolower($name);
            $this->doOPeration($this->numbers[$name]);
            $this->operation = null;
            return $this;
        }
      // Exécution de l’opération  
        public function doOperation($value){
        switch ($this->operation ){
                case '+':
                  $this->result += $value;
                  break;    
                 case '-':
                  $this->result -= $value;
                  break; 
                  case '/':
                  $this->result = intDiv($this->result,$value);
                  break;
                  case '*':
                  $this->result *= $value;
                  break;
                  default : $this->result = $value;
            }
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多