Нужна помощь PHP: класс для выполнения операций с целыми числами вместо этого должен работать с объектами

Я нашел в Википедии довольно хороший код для создания любого вида пользовательской операции с некоторой переменной, но она работает только с целыми числами, поэтому проблема заключается в том, чтобы заставить ее работать вместо пользовательских объектов. Вот что у меня уже есть и как оно работает:

  $user = new User();
$user->Compute('+', 100);
$user->Compute('-', 50);
$user->Compute('*', 10);
$user->Compute('/', 2); // output should be 100

$user->Undo(4); //output should be 0

$user->Redo(3); //output should be 50

Предположим, у меня есть свой собственный объект $ browser. Мне нужно сделать что-то вроде этого:

$o = new User($browser);
$o->Compute('navigate', 'google.com'); //like $browser->navigate('google.com')

вот полный источник:

/**
*
* @abstract
*/
abstract class Command
{
public abstract function Execute();
public abstract function UnExecute();
}


class CalculatorCommand extends Command
{
/**
*
*
* @var string
*/
public $operator;

/**
*
*
* @var mixed
*/
public $operand;

/**
*
*
* @var object of class Calculator
*/
public $calculator;

/**
*
*
* @param object $calculator
* @param string $operator
* @param mixed $operand
*/
public function __construct($calculator, $operator, $operand)
{
$this->calculator = $calculator;
$this->operator = $operator;
$this->operand = $operand;
}

/**
*
*/
public function Execute()
{
$this->calculator->Operation($this->operator, $this->operand);
}

/**
*
*/
public function UnExecute()
{
$this->calculator->Operation($this->Undo($this->operator), $this->operand);
}

/**
*
*
* @private
* @param string $operator
* @return string
*/
private function Undo($operator)
{
switch($operator)
{
case '+': $undo = '-'; break;
case '-': $undo = '+'; break;
case '*': $undo = '/'; break;
case '/': $undo = '*'; break;
default : $undo = ' '; break;
}
return $undo;
}
}

/**
*
*/
class Calculator {
/**
*
*
* @private
* @var int
*/
private $curr = 0;

public function Operation($operator,$operand)
{
switch($operator)
{
case '+': $this->curr+=$operand; break;
case '-': $this->curr-=$operand; break;
case '*': $this->curr*=$operand; break;
case '/': $this->curr/=$operand; break;
}
print("Current result - $this->curr (after $operator with $operand)");
}
}

class User {
/**
*
*
* @private
* @var object of class Calculator
*/
private $calculator;

/**
*
*
* @private
* @var array
*/
private $commands = array();

/**
*
*
* @private
* @var int
*/
private $current = 0;

public function __construct()
{
$this->calculator = new Calculator();
}

/**
*
*
* @param int $levels
*/
public function Redo($levels)
{
print("\n---- Repeat $levels operation ");

for ($i = 0; $i < $levels; $i++)
if ($this->current < count($this->commands) - 1)
$this->commands[$this->current++]->Execute();
}

/**
*
*
* @param int $levels
*/
public function Undo($levels)
{
print("\n---- Undo $levels operation ");

for ($i = 0; $i < $levels; $i++)
if ($this->current > 0)
$this->commands[--$this->current]->UnExecute();
}

/**
*
*
* @param string $operator
* @param mixed $operand
*/
public function Compute($operator, $operand)
{
$command = new CalculatorCommand($this->calculator, $operator, $operand);
$command->Execute();

$this->commands[]=$command;
$this->current++;
}
}

-1

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]