Почему невозможно выдать исключение от __ toString ()?

Почему невозможно выдать исключение от __ toString ()?

class a
{
    public function __toString()
    {
        throw new Exception();
    }
}

$a = new a();
echo $a;

код выше продуктов это:

Fatal error: Method a::__toString() must not throw an exception in /var/www/localhost/htdocs/index.php on line 12

На меня указали на http://php.net/manual/en/migration52.incompatible.php, где это поведение описано, но почему? Какие-либо причины сделать это?

Кто-либо может быть, здесь знает это?

В php-команде-разработчиков средства отслеживания ошибки, как обычно, говорит, только см. руководство: http://bugs.php.net/50699

44
задан Brian Webster 17 February 2013 в 05:54
поделиться

3 ответа

После нескольких поисков я нашел это, в котором говорится:

Йоханнес объяснил, что нет способа гарантировать, что исключение, созданное во время преобразования в строку, будет правильно обрабатываться Zend Engine , и что это не изменится, пока не будут переписаны большие части Engine. Он добавил, что подобные вопросы обсуждались в прошлом, и предложил Гилерме проверить архивы.

Йоханнес , о котором говорилось выше, является менеджером выпуска PHP 5.3, так что это, вероятно, столь же «официальное» объяснение, почему PHP ведет себя подобным образом.

Далее в разделе упоминается:

__ toString () , как ни странно, принимает trigger_error () .

Таким образом, не все потеряно с точки зрения сообщений об ошибках в __ toString () .

46
ответ дан 26 November 2019 в 22:13
поделиться

Я не думаю, что обоснование этого решения когда-либо оглашалось. Похоже на какое-то внутреннее архитектурное ограничение.

На более абстрактном уровне это имеет смысл. Объект должен иметь возможность возвращать строковое представление самого себя, без каких-либо причин для сбоя такого действия.

-1
ответ дан 26 November 2019 в 22:13
поделиться

Я предполагаю, что __ toString является хакерским и поэтому существует вне типичного стека. Таким образом, выброшенное исключение не знает, куда идти.

10
ответ дан 26 November 2019 в 22:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: