Добавьте __toString(): string, возвращающий строковое представление factorial(). Тогда echo $math вызовет преобразование объекта; отрицательное число по-прежнему должно приводить к ошибке.
Настройка строкового представления объекта Math
Добавьте __toString(): string, возвращающий строковое представление factorial(). Тогда echo $math вызовет преобразование объекта; отрицательное число по-прежнему должно приводить к ошибке.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Требуется изменить существующий код так, чтобы при попытке вывести объект класса Math через echo (без явного вызова метода) отображалось значение факториала числа, переданного в конструктор.
class Math
{
public function __construct(private int $value)
{
}
public function factorial(): int
{
if ($this->value < 0) {
throw new Exception("value less 0");
}
$product = 1;
for ($i = 1; $i <= $this->value; $i++) {
$product *= $i;
}
return $product;
}
}
$math = new Math(-5);
try {
echo $math->factorial();
} catch (Exception $e) {
echo $e->getMessage();
}
Ваша задача – добавить необходимый механизм (например, магический метод __toString), который будет возвращать результат factorial() и тем самым обеспечить корректный вывод при использовании echo $math;.
Ответ
Добавьте __toString(): string, возвращающий строковое представление factorial(). Тогда echo $math вызовет преобразование объекта; отрицательное число по-прежнему должно приводить к ошибке.
В существующий класс добавьте:
public function __toString(): string {
return (string) $this->factorial();
}
Использование для современных PHP:
try {
echo new Math(5);
} catch (Throwable $e) {
echo $e->getMessage();
}
Вывод — 120. Для new Math(-5) исключение возникнет при преобразовании в строку. Проверку переполнения надо добавить в factorial отдельно: __toString не делает арифметику безопаснее.