$this->A, 'b' => $this->B ]); } /** * Constructs a new instance of this class from an array representation * * @param array $data * @return InstructionInterface * @throws InstructionException */ public static function fromArray(array $data): InstructionInterface { $instruction = new self(); $instruction->setA($data['a'] ?? null); $instruction->setB($data['b'] ?? null); return $instruction; } /** * @param Engine $engine * @return int * @throws EvaluationException * @throws TypeException * @throws ZeroDivisionException */ public function eval(Engine $engine): int { $a = $engine->eval($this->A); $b = $engine->eval($this->B); if(!(is_int($a) || is_float($a) || is_double($a))) throw new TypeException('Cannot divide a non-numeric value'); if(!(is_int($b) || is_float($b) || is_double($b))) throw new TypeException('Cannot divide by a non-numeric value'); if ($b === 0) throw new ZeroDivisionException(sprintf('Division by zero in %s', $this)); return (intval($a) / intval($b)); } /** * Returns the string representation of the instruction * * @return string */ public function __toString(): string { return sprintf( self::getType() . ' (%s/%s)', Utilities::entityToString($this->A), Utilities::entityToString($this->B) ); } /** * Gets the value of A * * @return mixed */ public function getA(): mixed { return $this->A; } /** * Sets the value of A * * @param mixed $A * @throws InstructionException */ public function setA(mixed $A): void { $this->A = InstructionBuilder::fromRaw($A); } /** * Gets the value of B * * @return mixed */ public function getB(): mixed { return $this->B; } /** * Sets the value of B * * @param mixed $B * @throws InstructionException */ public function setB(mixed $B): void { $this->B = InstructionBuilder::fromRaw($B); } }