Сохраните число в свойстве конструктора и уберите аргумент factorial. Отрицательное значение отклоняется, 0! равно 1; перед умножением полезно проверять переполнение int.
Обновление класса Math: передача числа в конструктор
Сохраните число в свойстве конструктора и уберите аргумент factorial. Отрицательное значение отклоняется, 0! равно 1; перед умножением полезно проверять переполнение int.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Требуется изменить класс Math так, чтобы при его инстанцировании в конструктор передавалось одно целочисленное значение. После этого все методы класса должны работать с этим значением без необходимости каждый раз указывать аргумент.
class Math
{
public function factorial(int $num): int
{
if ($num < 0) {
throw new Exception("num less 0");
}
$resultNum = 1;
for($i = 1; $i <= $num; $i++)
{
$resultNum *= $i;
}
return $resultNum;
}
}
$math = new Math;
try {
echo $math->factorial(-5);
} catch (Exception $e) {
echo $e->getMessage();
}
Ответ
Сохраните число в свойстве конструктора и уберите аргумент factorial. Отрицательное значение отклоняется, 0! равно 1; перед умножением полезно проверять переполнение int.
class Math {
public function __construct(private int $value) {}
public function factorial(): int {
if ($this->value < 0) throw new InvalidArgumentException('num less 0');
$result = 1;
for ($i = 2; $i <= $this->value; $i++) {
if ($result > intdiv(PHP_INT_MAX, $i)) throw new OverflowException();
$result *= $i;
}
return $result;
}
}
try { echo (new Math(5))->factorial(); }
catch (Exception $e) { echo $e->getMessage(); }
Так методы работают с одним состоянием объекта. Для факториалов за пределами int нужен другой числовой тип или библиотека длинной арифметики.