[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Выйти из цепочки методов через исключение
Страницы: 1, 2, 3
inpost
Никак не могу придумать оптимальный вариант, на котором остановиться. Подскажите? Простой пример класса, который может быть импортирован в любой существующий проект:
$_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).
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.