И? В чем вопрос?ксепшн вполне может кинуться внутри метода, который вызывается в __toString(),
А это зависит от того то мы ему передадим.к тому же trigger_error() не несёт почти никакой полезной информации.
<?php
function errh($errno, $errstr, $errfile, $errline ) {
if ($errno == E_USER_DEPRECATED) {
var_dump(unserialize(stripslashes($errstr)));
return true;
} else {
return false;
}
}
set_error_handler("errh");
class C {
public function render()
{
return 'meet';
}
public function __toString()
{
try {
return $this->render();
} catch (Exception $e) {
$t = addslashes(serialize($e));
trigger_error($t,E_USER_DEPRECATED);
return '';
}
}
}
class D extends C {
public function render()
{
throw new Exception('Ooops');
}
}
$d = new D;
echo $d;
Не надо мне этого рассказывать. Лучше подумать о том, какой смысл ловить/бросать исключение при выводе или приведении объекта к строке?Fortop, смысл Exception не в том, что его можно кинуть, а в том, что его можно в строго определенном месте словить.
Это уже там было.Говно какое. bugs.php.net ?
Чем данные ситуации отличаются от других? Что в них такого особенного, что нельзя эксепшен кидать?Лучше подумать о том, какой смысл ловить/бросать исключение при выводе или приведении объекта к строке?
Fortop, то есть ты утверждаешь, что других ситуаций применения __toString, кроме вывода объекта быть не должно, а при непосредственном выводе уже поздно пить боржоми? но ведь вывод может идти в буфер и как раз исключение при выводе может менять логику отображения.при выводе или приведении объекта к строке
А подумать? Это право же несложно.Adelf
Чем данные ситуации отличаются от других? Что в них такого особенного, что нельзя эксепшен кидать?
То вообще все станет на свои места.It is worth noting that before PHP 5.2.0 the __toString method was only called when it was directly combined with echo() or print().
Судя по всему это не бага, это legacy код.Ага, как всегда, задокументированная бага становится фичей.
Я ничего не утверждаю.Fortop, то есть ты утверждаешь,
правильный вывод.Надо пинать все равно
Возможно и полезна. Но ее пока нет.2. полезна ли в принципе возможность исключений в __toString
из __toString() нельзя прокинуть эксепшн выше по стеку.
дай ссылку, где это явно описано.Я предлагаю не жить вашими иллюзиями. И пользоваться мануалами.
Судя по этому, типичный legacy код.It is worth noting that before PHP 5.2.0 the __toString method was only called when it was directly combined with echo() or print().
trigger_error('sample ' . chr(0) . ' sample');
Fortop опять умничает...А надувание щек и рассуждение о том какой язык г-но и как это нелогично... ну можно и так. Но это детский сад.
вообще-то на свои места оно не встало. что следует из того, что до 5.2 он использовался только совместо с echo и print?То вообще все станет на свои места.
ну конкретно ситуация такая: в шаблоне (класс View, который, собственно, тустрингается) у меня юзается объект user. user - получает данные из БД + facebook. из обоих сорсов - лениво. если очешь захотеть - можно получить ситуацию, когда получение данных из facebook вывалится с эксепшном (ожидаемым эксепшном). по этому событию на самой вершине стека у меня есть try / catch который обрабатывает ошибки коммуникации с facebook'ом.а ты расскажи, зачем тебе исключения понадобились для ту-стринг?
т.е. ты предлагаешь вместо удобных эксепшнов во всём проекте использовать такой костыль? который, к тому же, не содержит стектрейс, жутко необходимый мне для помещения в логи и дальнейшего изучения.А это зависит от того то мы ему передадим.
Костыль конечно, но можно так
в мануале явно этого не описано. свои эротические фантазии по этому поводу и самозаключениями можешь поделиться с комитетом спортлото.Я предлагаю не жить вашими иллюзиями. И пользоваться мануалами.
"судя по всему" или точно? сударь, вы уж определитесь, или это бага, или это не бага (в таком случае дружно просим ссылку на ЯВНОЕ УКАЗАНИЕ, что из __toString() нельзя выкинуть эксепшн)Судя по всему это не бага, это legacy код.