В общем имеется класс, который будет родителем для многих классов, эдакий сборник общих функций:
class main {
protected $error_display;
function __construct($error_display) {
$this -> error_display = $error_display;
}
// Вывод сообщений об ошибках по их коду
protected function get_error_message($class, $code) {
//Если обработка включена
if ($this -> error_display > 0) {
include './classes/error_codes/'. $class .'.php';
if ($class == 'mysql')
$log = 'mysql.log';
else
$log = 'main.log';
// Если включено логирование
if ($this -> error_display == 1) {
...
}
// Если включен вывод
if ($this -> error_display == 2 || $this -> error_display == 3)
...
}
}
}
Доступ к функции get_error_message существляется из другого класса:
class mysql extends main {
// Параметры соединения с базой
protected $db_server;
protected $db_name;
protected $db_user;
protected $db_password;
function __construct($db_server, $db_name, $db_user, $db_password) {
$this -> db_server = $db_server;
$this -> db_name = $db_name;
$this -> db_user = $db_user;
$this -> db_password = $db_password;
}
// Соединение с БД
function db_connect() {
if (is_string($this -> db_server) &&
is_string($this -> db_name) &&
is_string($this -> db_user) &&
is_string($this -> db_password)) {
$connect = mysql_connect($this -> db_server, $this -> db_user, $this -> db_password)
or die (parent::get_error_message(get_class(), 'ERROR_CODE_1'));
mysql_select_db($this -> db_name, $connect)
or die (parent::get_error_message(get_class(), 'ERROR_CODE_2'));
mysql_query('SET NAMES utf8');
mysql_query('SET CHARACTER SET utf8');
mysql_query('SET COLLATION_CONNECTION="utf8_general_ci"');
} else
die (parent::get_error_message(get_class(), 'ERROR_CODE_3'));
}
}
$construction = new main(ERROR_DISPLAY);
$db_connect = new mysql(HS_DB_SERVER, HS_DB_NAME, HS_DB_USER, HS_DB_PASSWORD);
$db_connect -> db_connect();
Если мускул не может соединиться с базой данных, то он должен выполнять родительскую функцию по обработке ошибок. В классе main это переменная ERROR_DISPLAY, значение которой берется из конфигурационного файла.
И собственно вопрос, как мне обратиться к DISPLAY_ERROR из метода дочернего класса? Как я не пробовал обращаться, все время возвращается пустота.
Спустя 19 минут, 38 секунд (27.08.2011 - 15:54) Zerstoren написал(а):
юзайте parent::method()
Спустя 4 часа, 20 минут, 16 секунд (27.08.2011 - 20:14) Guest написал(а):
function __construct(string $db_server, string $db_name, string $db_user, $db_password = '') {
$this -> db_server = $db_server;
$this -> db_name = $db_name;
$this -> db_user = $db_user;
$this -> db_password = $db_password;
}
Вместо проверки в методе db_connect()
И пароль ведь может быть и пустым, а ... :)
Спустя 1 минута, 41 секунда (27.08.2011 - 20:16) Guest написал(а):
И вообще то
$
так как protected наследуется
$
connect = mysql_connect($this -> db_server, $this -> db_user, $this -> db_password)
or die ($this->get_error_message(get_class(), 'ERROR_CODE_1'));
так как protected наследуется
Спустя 9 минут, 6 секунд (27.08.2011 - 20:25) Гость_Greg1978 написал(а):
Блин пришлось переписать
// Логичней определять имя класса по его аспектам знаний и требований
class Error{
protected $error_display;
function __construct($error_display) {
$this -> error_display = $error_display;
}
// Вывод сообщений об ошибках по их коду
protected function get_error_message($class, $code) {
//Если обработка включена
if ($this -> error_display > 0) {
include './classes/error_codes/'. $class .'.php';
if ($class == 'mysql')
$log = 'mysql.log';
else
$log = 'main.log';
// Если включено логирование
if ($this -> error_display == 1) {
...
}
// Если включен вывод
if ($this -> error_display == 2 || $this -> error_display == 3)
...
}
}
}
class mysql extends Error{
// Параметры соединения с базой
// Если сомневаетесь в выборе видимости переменной всегда лучше выбирать самый радикальный
// В этом случае эти свойства только этого класса
private $db_server;
private $db_name;
private $db_user;
private $db_password;
function __construct(string $db_server, string $db_name, string $db_user, $db_password = '') {
$this -> db_server = $db_server;
$this -> db_name = $db_name;
$this -> db_user = $db_user;
$this -> db_password = $db_password;
// Передаём константу из конфигурационного файла
parent::__construct(ERROR_DYSPLAY)
}
// Соединение с БД
function db_connect() {
$connect = mysql_connect($this -> db_server, $this -> db_user, $this -> db_password)
or die ($this->get_error_message(get_class(), 'ERROR_CODE_1'));
mysql_select_db($this -> db_name, $connect)
or die ($this->get_error_message(get_class(), 'ERROR_CODE_2'));
mysql_query('SET NAMES utf8');
mysql_query('SET CHARACTER SET utf8');
mysql_query('SET COLLATION_CONNECTION="utf8_general_ci"');
}
$db_connect = new mysql(HS_DB_SERVER, HS_DB_NAME, HS_DB_USER, HS_DB_PASSWORD);
$db_connect -> db_connect();
Спустя 9 минут, 55 секунд (27.08.2011 - 20:35) Гость_Greg1978 написал(а):
Но в этом случае конечно резонно было бы не наследование, так как Драйвер БД mysql "неявляется" подтипом класса обработки ошибок Error. В этом случае лучше использовать композицию и агрегировать объект $this->error = new Error(ERROR_DYSPLAY); c последующим использованием $this->error->get_error_message(get_class(), 'ERROR_CODE_2') . Что это даёт? При смене обработчика ошибок с таким же интерфейсом (методы get_error_message и ...) мы не получим конфликтов между Драйвером и обработчиком ошибок.
Спустя 2 минуты, 18 секунд Гость_Greg1978 написал(а):
И уменьшим связность двух объектов к минимуму, с дальнейшим пере использованием их отдельно.
Спустя 2 минуты, 18 секунд Гость_Greg1978 написал(а):
И уменьшим связность двух объектов к минимуму, с дальнейшим пере использованием их отдельно.
Спустя 2 минуты, 43 секунды (27.08.2011 - 20:38) neadekvat написал(а):
Думается мне, что это неправильная архитектура классов.
Каким таким боком класс для работы с базой связан с классом ошибок? Это совершенно разные сущности, с какого они там наследуются?
Должно быть два объекта: объект класса работы с бд и объект класс ошибок. С ними и работай.
upd.
P.S. Гость_Greg1978 именно об этом и говорит.
Каким таким боком класс для работы с базой связан с классом ошибок? Это совершенно разные сущности, с какого они там наследуются?
Должно быть два объекта: объект класса работы с бд и объект класс ошибок. С ними и работай.
upd.
P.S. Гость_Greg1978 именно об этом и говорит.
Спустя 1 час, 46 минут, 48 секунд (27.08.2011 - 22:25) TranceIT написал(а):
Смысл в том, что все функции обращаются к одной функции обработки ошибок и она их складывает или выводит на печать при соответствующем значении ERROR_DISPLAY
Спустя 6 минут, 48 секунд (27.08.2011 - 22:31) neadekvat написал(а):
TranceIT, а зачем тебе вообще класс для этого? Используй две обычных функции: add_error и print_error, плюс статическую переменную global_errors.
А коль класс хочешь, используй Синглтон, тогда у тебя также все ошибки будут в одном объекте собраны. Но второй вариант - он тут нафиг не нужен. По моему мнению. Но я за философию "просто лучше, чем сложно".
А коль класс хочешь, используй Синглтон, тогда у тебя также все ошибки будут в одном объекте собраны. Но второй вариант - он тут нафиг не нужен. По моему мнению. Но я за философию "просто лучше, чем сложно".
Спустя 3 минуты, 39 секунд (27.08.2011 - 22:35) Гость_Greg1978 написал(а):
Цитата (TranceIT @ 27.08.2011 - 19:25) |
Смысл в том, что все функции обращаются к одной функции обработки ошибок и она их складывает или выводит на печать при соответствующем значении ERROR_DISPLAY |
Тогда и пишите на процедурном
Функция вызывает функцию.
Если в стиле ООП, тогда лучше создать абстракцию (класс) ошибок и дать "клиентам" в доступ интерфейсы (открытые методы) для использования. Фикус в том что Вам затем захочется к примеру логирование сделать это будет легко интегрировать в класс ошибок не затрагивая при этом драйвер БД class mysql
Спустя 2 минуты, 38 секунд Гость_Greg1978 написал(а):
Самая большая связность в ООП считается наследование. Если Вам в будущем придётся разорвать эту связь main -> mysql большие будете иметь проблемы с рефакторингом и чем больше будет связных методов и свойств тем тяжелее будет потом.
Спустя 14 часов, 15 минут, 35 секунд (28.08.2011 - 12:51) TranceIT написал(а):
Всем большое спасибо. Почитал про агрегацию и абстрактные классы и все стало на свои места.
Спустя 18 часов, 52 минуты, 3 секунды (29.08.2011 - 07:43) linker написал(а):
Смысл ошибок в том, чтоб использовать Exception. Читаем в этом направлении.
Спустя 11 дней, 7 часов, 5 минут, 15 секунд (10.09.2011 - 14:48) TranceIT написал(а):
Немного запутался в определениях... Объясните мне, пожалуйста, для чего используются статические объекты?
В моем понимании, это объекты, к которым мы можем получить доступ не создавая экземпляр класса. То есть вместо:
Используется:
Если я правильно понимаю, то зачем все это нужно? Не проще ли создать просто функцию? Или это используется для того, чтобы указать принадлежность данного метода к определенному классу?
В моем понимании, это объекты, к которым мы можем получить доступ не создавая экземпляр класса. То есть вместо:
$mysql = new my_class;
$mysql -> my_object();
Используется:
my_class::my_object();
Если я правильно понимаю, то зачем все это нужно? Не проще ли создать просто функцию? Или это используется для того, чтобы указать принадлежность данного метода к определенному классу?
Спустя 1 час, 28 минут, 24 секунды (10.09.2011 - 16:16) TranceIT написал(а):
В чем отличие абстрактного класса от интерфейса? Когда использовать первый и второй? 10 страниц гугла перечитал, но никак не могу этого понять... Все разъяснения настолько запутаны и перегружены профессиональным жаргоном, что превращаются просто в набор слов... Вот например:
Цитата |
Использование абстрактных классов и интерфейсов является вопросом технологии программирования и в частности ООП-методик - дело в том в принципе на практике возможно использовать все эти объекты исключительно с семантическо-синтаксической точки зрения без реализации их истинной цели - как правило это происходит в небольших программах и проектах где вопрос об архитектуре не стоит - но зато применяется множество различных библиотек и участников кода взятых из сторонних источников для реализации некоторых задач - и если в оригинале использовать тех или иных шаблонов программирования было оправдано то в копии оно может быть и лишено первоначального предназначения В динамических языках программирования типа PHP все парадигмы очень простой обойти - в частности за счет возможности runtime-модификации все функций и классов и текущего исполняемого кода - и если что-то с точки зрения исходной парадигмы было запрещено по архитектурным соображениям то это легко разрешить здесь - мощным средством в PHP для этого является расширение runkit а в Perl это уже и так встроено в язык Таким образом если рассматривать понятия абстрактных классов и интерфейсов в идеализированном виде на без приложения к определенному языку программирования - то разницу можно определить примерно так В случае использования интерфейса конкретные реализации методов и значений свойств могут определяться только в порожденным им обычных классах без элементов меньшего порядка абстракции - в то время как абстрактный класс может содержать некоторые реализации методов и значения свойств по умолчанию "Интерфейс определяет границу взаимодействия между классами или компонентами, специфицируя определенную абстракцию, которую осуществляет реализующая сторона" - в то время как абстрактный класс является по сути шаблоном для наследуемых от него классов с указанием основных содержащих элементов и их взаимодействием |
Чтобы начинающему программисту это понять надо как минимум достичь состояния нирваны и иметь прямую связь с высшим межгалактическим разумом...
Спустя 2 часа, 10 минут, 34 секунды (10.09.2011 - 18:27) Guest написал(а):
Цитата (linker @ 29.08.2011 - 04:43) |
Смысл ошибок в том, чтоб использовать Exception. Читаем в этом направлении. |
Исключительные ситуации не обязательно должны быть ошибками, что верно и в обратном направлении, не все ошибки являются исключительными ситуациями.
Плохой совет, не в тему.
Спустя 2 часа, 17 минут, 13 секунд (10.09.2011 - 20:44) twin написал(а):
Цитата |
Исключительные ситуации не обязательно должны быть ошибками, что верно и в обратном направлении, не все ошибки являются исключительными ситуациями. Плохой совет, не в тему. |
Категорически поддерживаю.
Спустя 1 час, 40 минут, 56 секунд (10.09.2011 - 22:25) TranceIT написал(а):
В общем ответ на первый вопрос я нашел. Правильный он или нет, я не знаю, надеюсь на помощь знатоков.
Абстрактный класс позволяет нам создавать внутри него частичную функциональность и/или описывать эту функциональность. Так же в нем указываются абстрактные методы, которые обязательно должны быть реализованы в дочерних классах. Как бы для того, чтобы программист не забыл, что тут что-то должно быть.
Интерфейсы нам позволяют только указывать на методы, которые обязательно должны использоваться.
Абстрактный класс позволяет нам создавать внутри него частичную функциональность и/или описывать эту функциональность. Так же в нем указываются абстрактные методы, которые обязательно должны быть реализованы в дочерних классах. Как бы для того, чтобы программист не забыл, что тут что-то должно быть.
Интерфейсы нам позволяют только указывать на методы, которые обязательно должны использоваться.
Спустя 1 час, 14 минут, 43 секунды (10.09.2011 - 23:40) Guest написал(а):
Суть второго вопроса скорее упирается в проектирование... В сложных приложениях гораздо проще найти общие методы по интерфейсу, чем разжевывать длинную сосиску наследования...
Спустя 1 день, 8 часов, 36 минут, 3 секунды (12.09.2011 - 08:16) linker написал(а):
Guest
twin
Ещё раз прочитайте мой пост, потом посмотрите на код ТС и подумайте чё вы тут ляпнули.
twin
Ещё раз прочитайте мой пост, потом посмотрите на код ТС и подумайте чё вы тут ляпнули.
Спустя 14 минут, 9 секунд (12.09.2011 - 08:30) twin написал(а):
Так уж сразу и ляпнули...
По мне так ни вариант TranceIT, ни тем более ексепшены в данном контексте неинтересны. Причем ексепшены неинтереснее вдвойне, ибо мало того, что утяжеляют код, так еще и нещадно жрут ресурс.
А тут вполне достаточно обычного сервисного сообщения.
По мне так ни вариант TranceIT, ни тем более ексепшены в данном контексте неинтересны. Причем ексепшены неинтереснее вдвойне, ибо мало того, что утяжеляют код, так еще и нещадно жрут ресурс.
А тут вполне достаточно обычного сервисного сообщения.
$connect = mysql_connect($this -> db_server, $this -> db_user, $this -> db_password)ибо совершенно не важно, в каком методе осуществлялся коннект, если его нет. Метод тут не виноват.
or die ('No connect');
Спустя 11 минут, 37 секунд (12.09.2011 - 08:42) linker написал(а):
twin
Ну мне-то ты можешь не рассказывать про своё отношение к эксепшенам и ООП в целом А то, что использование исключения упрощают не только код, но и контроль за ходом выполнения приложения - это факт. Для хоумпаги, банальный die() сойдёт, для приличного приложения сообщение 'No connect' будет являться хамством.
Ну мне-то ты можешь не рассказывать про своё отношение к эксепшенам и ООП в целом А то, что использование исключения упрощают не только код, но и контроль за ходом выполнения приложения - это факт. Для хоумпаги, банальный die() сойдёт, для приличного приложения сообщение 'No connect' будет являться хамством.
Спустя 12 минут, 49 секунд (12.09.2011 - 08:54) twin написал(а):
Да ладно.
Что за такие "приличные" приложения, в которых нужно клепать кучу кода ради того, чтобы слогировать или вывести кучу совершенно незначимой и лишней информации? Ну если упал мускул, на кой мне знать, что за коннект отвечает метод db_connect(), а в твоем случе еще и то, что он находится в таком то файле на такой то строчке?
Показуха это все, раздувание ноздрей. Код должен быть максимально прозрачным и легким, вот тогда это красиво. А много лишних букаф - индуаизм.
Что за такие "приличные" приложения, в которых нужно клепать кучу кода ради того, чтобы слогировать или вывести кучу совершенно незначимой и лишней информации? Ну если упал мускул, на кой мне знать, что за коннект отвечает метод db_connect(), а в твоем случе еще и то, что он находится в таком то файле на такой то строчке?
Показуха это все, раздувание ноздрей. Код должен быть максимально прозрачным и легким, вот тогда это красиво. А много лишних букаф - индуаизм.
Спустя 12 минут, 18 секунд (12.09.2011 - 09:07) kirik написал(а):
Цитата (twin @ 12.09.2011 - 01:54) |
Ну если упал мускул, на кой мне знать, что за коннект отвечает метод db_connect(), а в твоем случе еще и то, что он находится в таком то файле на такой то строчке? |
Нужно эту ситуацию отловить и отправить запрос к резервному серверу БД (как пример), а не тупо убивать скрипт.
Спустя 42 минуты, 42 секунды (12.09.2011 - 09:49) twin написал(а):
Цитата (kirik @ 12.09.2011 - 06:07) | ||
Нужно эту ситуацию отловить и отправить запрос к резервному серверу БД (как пример), а не тупо убивать скрипт. |
Ексепшены тут причем? Если есть резервные сервера, то и система должна быть спроектирована подходящим образом. Ты расскажи вконтактам каким-нибудь, что резервы нужно подтягивать эксепшенами, засмеют.
Вотпрос был вот в этом:
Цитата | ||
Исключительные ситуации не обязательно должны быть ошибками, что верно и в обратном направлении, не все ошибки являются исключительными ситуациями. Плохой совет, не в тему. |
На что linker сказал, что мы ляпнули неподумав. А я еще раз повторю - исключительная ситуация не всегда есть ошибка скрипта. Мускул падает - скрипт причем? Зачем выворачивать его на изнанку?
Спустя 16 минут, 41 секунда (12.09.2011 - 10:06) kirik написал(а):
Цитата (twin @ 12.09.2011 - 02:49) |
Если есть резервные сервера, то и система должна быть спроектирована подходящим образом. |
Это просто как пример А если нужно вывести вместо "No connect" красивую страничку с "На сайте проводится профилактика", то придётся лезть в либу и изменять что-то внутри неё? Не кошерно, однако
Спустя 22 минуты, 48 секунд (12.09.2011 - 10:29) linker написал(а):
twin
Речь не о вконтактах, вконтакты и прочие- это частные случаи, там всё запиливается исключительно под себя, фейсбуки даже компиляторы придумывают под пыха. А вы прицепились к моему посту, хотя моя речь идёт о том, что в данных ошибках работы приложения нет нужды городить велосипед, когда имеются эксепшены.
Речь не о вконтактах, вконтакты и прочие- это частные случаи, там всё запиливается исключительно под себя, фейсбуки даже компиляторы придумывают под пыха. А вы прицепились к моему посту, хотя моя речь идёт о том, что в данных ошибках работы приложения нет нужды городить велосипед, когда имеются эксепшены.
Спустя 6 минут, 47 секунд (12.09.2011 - 10:36) twin написал(а):
Ну так то да, суть только в том, где их стоит применять, а где нет. Я именно это имел ввиду, когда "ляпал".
Спустя 7 минут, 19 секунд (12.09.2011 - 10:43) linker написал(а):
twin
Ну не всегда стоит глобализировать, когда речь идёт о чём-то конкретном.
Ну не всегда стоит глобализировать, когда речь идёт о чём-то конкретном.
Спустя 9 минут, 17 секунд (12.09.2011 - 10:52) twin написал(а):
Вот именно. В данном конкретном случае ексепшенам ну вообще не место) Собственно как и тому огороду, что мы видим у ТС.
Спустя 10 минут, 25 секунд (12.09.2011 - 11:03) linker написал(а):
Человек учится, как и в каких приложениях он будет применять свои знания ты знать не можешь. Речь в данном случае идёт о велосипеде, который лечится в данном случае исключениями (тут тоже можно наследоваться и строить свои классы исключений - это тоже учёба). О твоём негативном отношении к ООП речи не идёт.
Спустя 13 минут, 19 секунд (12.09.2011 - 11:16) twin написал(а):
Причемтут ООП... Тут речь вообще о применении ексепшенов вроде как. И о их месте применения.
Мы уже спорили на эту тему один раз, зачем повторяться. Ну вот допустим я не использую эксепшены, ну не нравятся они мне. И есть у меня свой велосипед, который позволяет писать код намного чище, нежели с ними. И похож он на представленный кстати.
Тогда мы пришли к тому, что исключения нельзя бросать в контексте программы, а можно только в "тонких" местах. Так я не вижу смысла до сих пор, городить тяжеловесные try... cach в таком случае, если можно пользоваться легеньким or
Ведь or не обязательно нужно сопровождать die(), можно и своей функцией/методом. А там трассируй, логируй, рисуй странички красивые, как kirik хотел или вообще делай все, что душе угодно.
Так что учеба учебой, но выбирать ему. И твоё категричное заявление
Мы уже спорили на эту тему один раз, зачем повторяться. Ну вот допустим я не использую эксепшены, ну не нравятся они мне. И есть у меня свой велосипед, который позволяет писать код намного чище, нежели с ними. И похож он на представленный кстати.
Тогда мы пришли к тому, что исключения нельзя бросать в контексте программы, а можно только в "тонких" местах. Так я не вижу смысла до сих пор, городить тяжеловесные try... cach в таком случае, если можно пользоваться легеньким or
Ведь or не обязательно нужно сопровождать die(), можно и своей функцией/методом. А там трассируй, логируй, рисуй странички красивые, как kirik хотел или вообще делай все, что душе угодно.
Так что учеба учебой, но выбирать ему. И твоё категричное заявление
Цитата |
Смысл ошибок в том, чтоб использовать Exception. Читаем в этом направлении. |
лично меня повергает в ступор. Не всегда и не совсем смысл ошибок в том, чтобы их использовать, эксепшены эти.
Спустя 20 минут, 6 секунд (12.09.2011 - 11:36) linker написал(а):
Твой вариант с or и своей функцией будет оторван от контекста - ситуации при которой произошла ошибка и в этом состоит главный минус. Другой минус в том, что в твоём случае некий участок кода привязан к тому, как должна обрабатываться ошибка, хотя это в нормальном программировании не его забота. Его проблема только "сообщить", что была ошибка, как должно поступать при её возникновении решать тому участку кода, который ожидает какого-то результата. Это есть нормально и логично. Я уж молчу о командной разработке. Мой пост не имеет смысла без
Цитата |
Смысл в том, что все функции обращаются к одной функции обработки ошибок и она их складывает или выводит на печать при соответствующем значении ERROR_DISPLAY |
ну и собственно самого первого поста ТС.
Спустя 44 минуты, 9 секунд (12.09.2011 - 12:20) twin написал(а):
Такс.
Вот так ты предлагаешь делать, я помню:
А ну ка попробуй так же раскритиковать это:
Вот так ты предлагаешь делать, я помню:
function mega_secure_func($kode = null)
{
if (is_null($kode))
throw new Exception('Fatal error. Kode is null.');
}
$a = null;
try
{
mega_secure_func($a);
}
catch(Exception $Except)
{
die($Except->getMessage());
}
А ну ка попробуй так же раскритиковать это:
function mega_secure_func($kode = null)Чем сие отличается? Про командную разработку действительно стоит умолчать. Команда команде рознь.
{
if (is_null($kode))
exept('Fatal error. Kode is null.');
}
$a = null;
mega_secure_func($a);
function exept($message)
{
die($message);
}
Спустя 1 час, 16 минут (12.09.2011 - 13:36) linker написал(а):
Фишка в том, что ты возвращаешься обратно к блоку try {} catch() {} где в catch'е можешь реагировать на исключение, тем более таких вызовов mega_secure_func() может быть несколько в разных местах приложения и тем более если эти вызовы зависят от ситуации и код-реагирование может меняться в зависимости от этой ситуации. Т.е. например, в одном месте достаточно сделать die() с текстом ошибки, в другом месте что-то куда-то записать и только потом сделать die(), в третьем ещё что-нибудь. В твоём случае с одной функцией тебе придётся хреначить кучу условий под каждую ситуацию и всё это дело тащить через весь код.
Чтобы ты понял, я приведу иной пример
Чтобы ты понял, я приведу иной пример
class Userв другом скрипте, где разрешено только зарегистрированным пользователям находится мы просто напишем
{
public static function getUser()
{
...
if (!$result)
throw new Exception('Произошла ошибка');
self::login($name, $pass);
}
public static function login($name, $pass)
{
...
if (!$result)
throw new InvalidUser('Нет такого')
}
public static function asGuest() {}
}
try
{
$user = User::getUser();
}
catch(InvalidUser $e)
{
$user = User::asGuest();
}
catch(Exception $e)
{
die($e->getMessage());
}
echo "Привет, " . $user->name;
tryТаким образом мы локализуем любую проблему в приделах одного блока try catch текущей ситуации и не надо нам шариться в поисках а где же и что же сработало, мало данных echo $e->getTraceAsString(); и мы видим где и что же произошло.
{
$user = User::getUser();
}
catch(Exception $e)
{
die($e->getMessage());
}
Спустя 1 час, 26 минут, 55 секунд (12.09.2011 - 15:03) twin написал(а):
Ну так а в чем разница, я так и не уловил.
Тут просто религия не позволяет писать в рамках одного проекта двух функций с одинаковыми именами, вот и все. А смысл одн и тот же. В одной области видимости и двух одинаковых catch нельзя. Так в чем разница между этим:
и этим
Вот сделают в шестой ветке неймспейсы, даже политическая окраска у ексепшенов пропадет. Потому что они громоздкие и жручие. :)
Тут просто религия не позволяет писать в рамках одного проекта двух функций с одинаковыми именами, вот и все. А смысл одн и тот же. В одной области видимости и двух одинаковых catch нельзя. Так в чем разница между этим:
catch(Exception $e)
{
die($e->getMessage());
}
и этим
function exept($message)?
{
die($message);
}
Вот сделают в шестой ветке неймспейсы, даже политическая окраска у ексепшенов пропадет. Потому что они громоздкие и жручие. :)
Спустя 15 минут, 44 секунды (12.09.2011 - 15:19) linker написал(а):
По моему разницу я объяснил и даже пример описал. А ты выдрал из контекста кусок кода не обращая внимания на его смысл в общем логическом плане. Разница в том, что я по разному реагирую на исключение, а ты пускаешь всё через одну дырку function exept($message). Ещё раз, допустим есть скрипт, в котором описан класс
class Userдопустим есть второй скрипт, который что-то отображает для любого пользователя
{
public static function getUser()
{
...
if (!$result)
throw new Exception('Произошла ошибка');
self::login($name, $pass);
}
public static function login($name, $pass)
{
...
if (!$result)
throw new InvalidUser('Нет такого')
}
public static function asGuest() {}
}
tryдопустим есть третий скрипт, который что-то отображает, только для зарегистрированных пользователей
{
$user = User::getUser();
}
catch(InvalidUser $e)
{
$user = User::asGuest();
}
catch(Exception $e)
{
die($e->getMessage());
}
echo "Привет, " . $user->name;
tryвопрос в чём разница ещё возникает?
{
$user = User::getUser();
}
catch(Exception $e)
{
die($e->getMessage());
}
echo "Привет зарегистрированный пользователь, " . $user->name;
Спустя 10 минут, 34 секунды (12.09.2011 - 15:29) twin написал(а):
Да ипишкин кот... Это ты не можешь врубиться никак. Вот я пишу
и
class User
{
public static function getUser()
{
...
if (!$result)
exception('Произошла ошибка');
self::login($name, $pass);
}
public static function login($name, $pass)
{
...
if (!$result)
invalidUser('Нет такого')
}
public static function asGuest() {}
}
$user = User::getUser();
function exception($e)
{
$user = User::asGuest();
}
function invalidUser($e)
{
die($e);
}
echo "Привет, " . $user->name;
и
Цитата |
допустим есть третий скрипт, который что-то отображает, только для зарегистрированных пользователей |
$user = User::getUser();
function exception($e)
{
die($e);
}
echo "Привет зарегистрированный пользователь, " . $user->name;
В чем принципиальная разница, окромя религиозных соображений?
Спустя 7 минут, 41 секунда (12.09.2011 - 15:37) linker написал(а):
1. Напутал малясь.
2. Переопределение одной и той же функции
3. Второй не учитывает exception()
4. Куча разных функций с одинаковыми названиями и разными реализациями.
5. Класс User не является самодостаточным и зависит от неких внешних функций exception() и InvalidUser().
Честно, у тебя получился говнокод полный.
2. Переопределение одной и той же функции
3. Второй не учитывает exception()
4. Куча разных функций с одинаковыми названиями и разными реализациями.
5. Класс User не является самодостаточным и зависит от неких внешних функций exception() и InvalidUser().
Честно, у тебя получился говнокод полный.
Спустя 53 минуты, 41 секунда (12.09.2011 - 16:31) twin написал(а):
Ну напутал - поправил. Суть от этого не меняется.
Из всех претензий только одна в тему - по поводу самодостаточности класса. Все остальное мимо кассы. Да и то спорно. Класс, снабженный внутренним собственным дебаггером, куда как самодостаточнее внешних try catch . А пользовательские фишки плана "Привет зарегистрированный пользователь" гораздо проще решаются ретурнами. Вернул метод false - реагируй как нужно. Причем тут же, не бегая по всему файлу в поисках блоков. А прежде чем блоки организовать - по классу. Там же тоже всякие throw new InvalidUser, а документацию похерили.
Определение говнокодинга у каждого разное. По мне так верхом говнокодинга является класс, каждый метод которого бросает исключение. Для разработки может и удобно, когда все ошибки видно в одном месте. А вот в продакшене это гири на ногах.
Иногда конечно они полезны, бывают всякие ситуации, я не то, чтобы их в штыки. Но не так фанатично лепить их куда ни поподя.
Из всех претензий только одна в тему - по поводу самодостаточности класса. Все остальное мимо кассы. Да и то спорно. Класс, снабженный внутренним собственным дебаггером, куда как самодостаточнее внешних try catch . А пользовательские фишки плана "Привет зарегистрированный пользователь" гораздо проще решаются ретурнами. Вернул метод false - реагируй как нужно. Причем тут же, не бегая по всему файлу в поисках блоков. А прежде чем блоки организовать - по классу. Там же тоже всякие throw new InvalidUser, а документацию похерили.
Определение говнокодинга у каждого разное. По мне так верхом говнокодинга является класс, каждый метод которого бросает исключение. Для разработки может и удобно, когда все ошибки видно в одном месте. А вот в продакшене это гири на ногах.
Иногда конечно они полезны, бывают всякие ситуации, я не то, чтобы их в штыки. Но не так фанатично лепить их куда ни поподя.
Спустя 15 минут, 44 секунды (12.09.2011 - 16:47) linker написал(а):
Да суть не меняется, как был говнокод с кучей нелепых функций, так и остался.
Не нужны классу дебаггеры вообще, неотловленные ексепшены отловит сам php, либо кодер вручную через set_exception_handler() пропустит через свою функцию и обработает так, как ему нужно. Ты забываешь ещё об одной важной фишке, эксепшен может возникнуть и внутри кода, который я пометил как .... Там тоже много чего может произойти и всё это локализуется в одном месте - в месте вызова User::getUser(). Потерял доку, сделай try {} catch(Exception $e) {} и посрать на твою доку. А тебя без бутылки, где и какую функцию объявлять, не разберёшься.
Холивар, короче. Знаю что бесполезняк тебе объяснять суть, но всё равно блин втягиваешь.
Не нужны классу дебаггеры вообще, неотловленные ексепшены отловит сам php, либо кодер вручную через set_exception_handler() пропустит через свою функцию и обработает так, как ему нужно. Ты забываешь ещё об одной важной фишке, эксепшен может возникнуть и внутри кода, который я пометил как .... Там тоже много чего может произойти и всё это локализуется в одном месте - в месте вызова User::getUser(). Потерял доку, сделай try {} catch(Exception $e) {} и посрать на твою доку. А тебя без бутылки, где и какую функцию объявлять, не разберёшься.
Холивар, короче. Знаю что бесполезняк тебе объяснять суть, но всё равно блин втягиваешь.
Спустя 1 час, 10 минут, 34 секунды (12.09.2011 - 17:57) twin написал(а):
Я вас умоляю. Говнокод, это то, что написано говнокодером для говнокодеров. Тем, кто не может управлять своим кодом без этих костылей на каждом шагу. И для тех, кто в двух соснах не может найти тропинку.
Я имел ввиду совсем не тот всторенный дебаггер, который отлавливает ошибки кодинга. Их вообще в продакшене быть не должно. А в разработке, ты правильно отметил, вполне хватает средств и бех этих монструозностей.
Я имел ввиду именно пользовательский дебаггер. Который без всяких трюков и качей выдаст ошибку использования. Допустим в почтовом классе можно сразу предусмотреть сообщение о неверно введенном мыле. Или аплоадер, который сам расскажет, почему вдруг отказался принять файл.
Такой класс куда как самодостаточнее будет. И работать с ним проще. Отработал штатно - продолжаем движение. Нет - выбираем. Либо удовлетвориться тем, что имеется в арсенале, либо реагируем иначе.
А нештатные ситуации, которые кстати мы уже обсуждали тут, совершенно не нуждаются в ексепшенах.
Если нужно отловить такую ситуацию и слогировать её, можно конечно пользоваться и эксепшенами, а можно и обычной функцией, и даже простым сервисным сообщением, как в примере с коннектом. Что где выгоднее.
Так вот, ситуации, где ексепшены действительно полезны, можно пересчитать по пальцам одной руки.
Все остальное - чистейшей воды говнокодинг, в продакшене особенно.
И вот это
Я имел ввиду совсем не тот всторенный дебаггер, который отлавливает ошибки кодинга. Их вообще в продакшене быть не должно. А в разработке, ты правильно отметил, вполне хватает средств и бех этих монструозностей.
Я имел ввиду именно пользовательский дебаггер. Который без всяких трюков и качей выдаст ошибку использования. Допустим в почтовом классе можно сразу предусмотреть сообщение о неверно введенном мыле. Или аплоадер, который сам расскажет, почему вдруг отказался принять файл.
Такой класс куда как самодостаточнее будет. И работать с ним проще. Отработал штатно - продолжаем движение. Нет - выбираем. Либо удовлетвориться тем, что имеется в арсенале, либо реагируем иначе.
А нештатные ситуации, которые кстати мы уже обсуждали тут, совершенно не нуждаются в ексепшенах.
Если нужно отловить такую ситуацию и слогировать её, можно конечно пользоваться и эксепшенами, а можно и обычной функцией, и даже простым сервисным сообщением, как в примере с коннектом. Что где выгоднее.
Так вот, ситуации, где ексепшены действительно полезны, можно пересчитать по пальцам одной руки.
Все остальное - чистейшей воды говнокодинг, в продакшене особенно.
И вот это
Цитата |
Потерял доку, сделай try {} catch(Exception $e) {} |
понт. Ибо там не только Exception может оказаться, а еще и InvalidUser. И без доки ты поплыл. Все равно полез в класс, если способен. А не способен, никакие ексепшены не спасут.
Спустя 2 часа, 48 минут, 6 секунд (12.09.2011 - 20:45) kirik написал(а):
Цитата (twin @ 12.09.2011 - 10:57) |
там не только Exception может оказаться, а еще и InvalidUser. |
Все исключения проекта должны быть унаследованы от Exception, и какое-бы исключение небыло выброшено, оно отловится catch(Exception $e) в любом случае.
Спустя 1 час, 56 минут, 39 секунд (12.09.2011 - 22:42) Greg1978 написал(а):
Да, это я тот, который "ляпнул". Впервые с twin во мнении сошлись
linker
Не ведись на свои чувства и тех, которые кричат что исключения это всё!!!
Докажу.
Исключения в PHP не то что в PERL (в нём это специфический принцип программирования). В любом другом ЯП, объект имеющий исключение говорит (нет наверное кричит ) "Я НЕ ЗНАЮ КАК ЭТУ ОШИБКУ ОБРАБОТАТЬ", после чего принимается обрабатывать её верхнеуровневый объект (класс) и т.д., для того их и назвали ИСКЛЮЧЕНИЯ, в полном смысле этого слова. Смысл в том что исключения сейчас используют в контексте "перескакивания" алгоритма обработки, это с PERL, и это довольно спорно.
Но, могу конечно привести ситуэйщин, когда нужен вверх нисходящий поток в любых раскладах. Это несостоятельность перехвата AJAX от сервера исключениями и вывод ощибок самого PHP в формате сигнатуры типа (function (string $string){}), при котором передаваемый параметр не string. Вот где исключение, это не известная ошибка, которая в результате не понятных причин выскочила за рамки, тем более что исключение, которое не перехвачено ajax - ом не выведится, а будет просто HTML только пустой. А о том что класс USER отдаёт свою ошибку и говорит что я не могу с ней справиться - это глубокая ошибка её отдавать наружу. Почему? Потому как мы этим говорим всем "клиентам", использующим наш класс что у нас оказывается есть ещё проблемы, которые мы не в состоянии решить, хотя эти проблемы нашего (классового) уровня.
linker
Не ведись на свои чувства и тех, которые кричат что исключения это всё!!!
Докажу.
Исключения в PHP не то что в PERL (в нём это специфический принцип программирования). В любом другом ЯП, объект имеющий исключение говорит (нет наверное кричит ) "Я НЕ ЗНАЮ КАК ЭТУ ОШИБКУ ОБРАБОТАТЬ", после чего принимается обрабатывать её верхнеуровневый объект (класс) и т.д., для того их и назвали ИСКЛЮЧЕНИЯ, в полном смысле этого слова. Смысл в том что исключения сейчас используют в контексте "перескакивания" алгоритма обработки, это с PERL, и это довольно спорно.
Но, могу конечно привести ситуэйщин, когда нужен вверх нисходящий поток в любых раскладах. Это несостоятельность перехвата AJAX от сервера исключениями и вывод ощибок самого PHP в формате сигнатуры типа (function (string $string){}), при котором передаваемый параметр не string. Вот где исключение, это не известная ошибка, которая в результате не понятных причин выскочила за рамки, тем более что исключение, которое не перехвачено ajax - ом не выведится, а будет просто HTML только пустой. А о том что класс USER отдаёт свою ошибку и говорит что я не могу с ней справиться - это глубокая ошибка её отдавать наружу. Почему? Потому как мы этим говорим всем "клиентам", использующим наш класс что у нас оказывается есть ещё проблемы, которые мы не в состоянии решить, хотя эти проблемы нашего (классового) уровня.
Спустя 13 минут, 2 секунды (12.09.2011 - 22:55) Greg1978 написал(а):
Цитата (twin @ 12.09.2011 - 14:57) |
Если нужно отловить такую ситуацию и слогировать её, можно конечно пользоваться и эксепшенами, а можно и обычной функцией, и даже простым сервисным сообщением, как в примере с коннектом. Что где выгоднее. |
Я то же согласен на все сто.
Только просто они в модульных тестах очень помогают, один центр скопления ошибок, не надо писать свой, да и тесты все уже подточены под них. А так с них почти нет толку, мне даже кажется много для них уделяют внимания, которого можно обойти более простыми путями.
Во многом они слишком специфицируют и сужают архитектуру.
Цитата |
Смысл ошибок в том, чтоб использовать Exception. Читаем в этом направлении. лично меня повергает в ступор. Не всегда и не совсем смысл ошибок в том, чтобы их использовать, эксепшены эти. |
Меня честно то же, гы.
Спустя 12 минут, 6 секунд (12.09.2011 - 23:07) Greg1978 написал(а):
Цитата (twin @ 12.09.2011 - 13:31) |
Из всех претензий только одна в тему - по поводу самодостаточности класса. Все остальное мимо кассы. Да и то спорно. Класс, снабженный внутренним собственным дебаггером, куда как самодостаточнее внешних try catch . А пользовательские фишки плана "Привет зарегистрированный пользователь" гораздо проще решаются ретурнами. Вернул метод false - реагируй как нужно. Причем тут же, не бегая по всему файлу в поисках блоков. А прежде чем блоки организовать - по классу. Там же тоже всякие throw new InvalidUser, а документацию похерили. Определение говнокодинга у каждого разное. По мне так верхом говнокодинга является класс, каждый метод которого бросает исключение. Для разработки может и удобно, когда все ошибки видно в одном месте. А вот в продакшене это гири на ногах. Иногда конечно они полезны, бывают всякие ситуации, я не то, чтобы их в штыки. Но не так фанатично лепить их куда ни поподя. |
Я перед Вами преклоняюсь , я жирным выделил (правда без Вашего спроса) ключевые слова.
Кстати , с этим можно поспорить с разрабами YII? у них совершенно свой механизм исключений и ошибок, наряду с уже устоявшимся PHP - шными исключениями.
Спустя 3 минуты, 5 секунд (12.09.2011 - 23:10) Greg1978 написал(а):
Цитата (linker @ 12.09.2011 - 13:47) |
... неотловленные ексепшены отловит сам php, либо кодер вручную через set_exception_handler() пропустит через свою функцию и обработает так, как ему нужно. Ты забываешь ещё об одной важной фишке, эксепшен может возникнуть и внутри кода, который я пометил как .... |
Да не отловит он при приёме AJAX, особенно JSON методом, потому и считается сырой технологией.
_____________
Безвозмездно помогаю только тем, кто сам пытается что-то сделать.
Остальным за WMR
Даже если там 10 строк кода!
Даже если мне это ничего не стоит!
Даже если вы нуб!