$_GET['a'] = 1;
class myClass {
public function x1() {
$this->x2();
echo 'Финал';
}
public function x2() {
$this->x3();
}
public function x3() {
if(isset($_GET['a'])) {
throw new Exception('ups');
}
$this->x4();
}
public function x4() {
echo 'Всё ок!';
}
}
$x = new myClass();
$x->x1();
// а тут следующий код
Выше пример лишь демонстрирует то, что я хочу. Итак очевидно, что выйдет ошибка + с глобальными мы не работаем. Вопрос о другом. :)
Как выйти из цепочки целого класса? Если внутри метода добавить исключение, или return, то мы выпрыгнем из метода x3, при этом в методе x1 после у нас выведется текст "Финал". Мне надо, чтобы выходили ПОЛНОСТЬЮ, то есть надпись "Финал" не выводилась, а именно заканчивалась работа с цепочкой методов $x->$x1()... и приступали к выполнению следующего кода.
Добавлять проверки внутри каждого метода? Кажется избыточным класс будет:
public function x1() {
if(!$this->x()) {
return false;
}
echo 'Финал';
}
Избыточность, кругом одни проверки на каждом шагу.
set_exception_handler - не подходит. Так как в случае интеграции в другой проект там уже могут быть СВОИ set_exception_handler. Цель скрипта заставить работать красиво без изменения общей структуры. Класс должен быть независимым.
На ум приходит следующий способ. Обязать всех окутывать в оболочку:
try {
$x = new myClass();
$x->x1();
} catch(Exception $e) {}
Снова же, работая в нескольких местах писать лишние 2-3 строчки, и после пустой Exception с намёком, что вы можете. А если не хотите, то всё равно писать стоит... Мне кажется, что опять таки избыточный вариант.
Следом приходит на ум магический метод __call с вызовом несуществующих методов:
public function _x1() {
...
}
public function _x3() {
if(isset($_GET['a'])) {
throw new Exception('ups');
}
$this->x4();
}
...
private function __call($name,$args) {
try {
$name = '_'.$name;
$this->$name($args);
} catch(Exception $e) {myExpection($e);}
}
private function myExpection($e) {
// моё исключение
}
$x = new myClass();
$x->x1();
Какие плюсы вижу я:
1) На выходе мы получаем чистый код без исключений.
2) Через наследие можно изменить на своё собственное исключение каждый, кто возжелает сделать это.
Что меня смущает:
1) Заблокировал магический метод __call.
2) Оооочень похоже на костыль. :ph34r: :ph34r: :ph34r:
___________________________________________________________
Ложусь спать, буду думать. Пока немного загнан в тупик... может подскажите, наведёте на верное решение?
_____________
Обучаю веб-программированию качественно и не дорого: http://school-php.com
Фрилансер, принимаю заказы: PHP, JS, AS (видео-чаты). Писать в ЛС (Личные сообщения на phpforum).