Обновление класса Math: передача числа в конструктор

Сохраните число в свойстве конструктора и уберите аргумент factorial. Отрицательное значение отклоняется, 0! равно 1; перед умножением полезно проверять переполнение int.

Короткий ответ

Что ответить на собеседовании

Сохраните число в свойстве конструктора и уберите аргумент 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 нужен другой числовой тип или библиотека длинной арифметики.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее