Чтобы не плодить свои ламерские топики. Задам сразу несколько вопросов здесь. Итак. Вопрос первый. Начиная дружить с ООП и дойдя до исключений не совсем понял зачем они нужны. Зачем бросать исключения вот так: If (условие) throw new Exception; потом их ловить, выводить getMessage() и заниматься всеми этими плясками с бубном. Если можно сделать так: If (тоже самое условие) echo 'Простите ошибочка' // И дальше тутже выполнить все нужные процедуры на случай ошибки Но потом мне пришла в голову мысль что исключения нужны на случай таких ошибок, в результате которых пхп-обработчик просто не скомпилирует сценарий до конца. Прошу скажите мне прав я тут или что то не понимаю. Вопрос второй.Про буферизацию вывода. Как я понял буферезация нужна чтобы поместить в буфер всё то что должно выводиться и(!!!) обработать всё это функцией(которая является первым необязательным параметром ob_start'а). Но если это так, то для чего нужна ob_end_clean. После вызова которой не выведеться вообще ничего. Больше идей по поводу буферизации вывода у меня нет. Прошу пояснить мне для чего нужна буферизация вывода. Ну и третий вопрос про статические переменные. Вот например: Код (Text): <?php function increment { static $a=0; echo $a++; } //Вызываем нашу функцию два раза increment(); increment(); ?> В результате получим 0 1, а не 0 0. Я понимаю что значение $a сохраняется. Но ведь вызывая функцию второй раз значение переменной снова объявляется как 0. Всем буду благодарен за ответы.
исключения нужны для простого красивого но мощного кода. в процессе работы возникают разные странные состояния. пытаться всё это уловить иф-элсами - получится глубокий нестинг, совершенно некрасивый и повторяющийся код. плюс иф-элс работает в текущей области видимости а исключение бросается в сторону выхода из псевдофункции main() - лови где хочешь. к ооп исключения "практически" не имеют никакого отношения - только наследование исключений использует ооп, а в целом исключения можно использовать и в функциональном программировании. об_энд_клин нужна чтоб выключить буфер текущего уровня убив его содержимое которое могло там накопиться. буферы же для того чтоб перехватить содержимое в потоке. а потом с содержимым поработать. если содержимое более не нужно - его можно убить. данная функция убивает содержимое и отменяет буфер. есть и другие варианты чистки буфера и другие варианты отмены буфера - мануал всё подробно описывает. про статические переменные. простейший ответ - объявление. ну реально. посмотрите на свою вторую строку функции - эхо с постинкрементом. эхо не вопрос. а к какому значению единичку-то прибавлять? вот это значение вы и объявляете в первой строке - ноль. а потом оно уже объявлено и данная строка будет пропущена при последующих вызовах функции.
Исключение не обязательно ошибка. В конструктор исключения можно вместо текста "Аааа!! ошибка!" передать объект и вообще любую переменную. Плюс свои классы исключений. Например если мы имеем вложенный цикл, как одним махом выйти из всех? break прервет только один, текущий. Вместо break на каждом уровне можно бросить исключение своего класса с результатом в аргументе и поймать над всеми циклами.
Ganzal Что делает функция ob_end_clean я понимаю. Я не пойму зачем она нужна. Зачем удалять отредактированное содержимое буфера которое нам надо вывести.
нет, вы не понимаете зачем буферы нужны. в вашем понимании это мы что-то там поймали, изменили это обязательно нужно вывести. нифига. это просто прослойка между функциями вывода данных (эхо, принты и тд) и выходным потоком приложения (stdout процесса или буфер апача). грубо говоря чтоб не юзать .= напихивая в строку делаем просто удобный вывод в поток который перехвачен в буфер. а буферы разные бывают. например в своих демонах я юзаю буферы для журналирования. ну сами подумайте. когда процесс уходит в демонизацию у него физически отсутствует поток вывода и любые случайные данные которые туда захотят пролезть - положат скрипт на лопатки. очень обидно. а так - вешаешь буфер и все направляешь в нужную сторону. например в файл журнала. а потом например подключаешься к демону другим скриптом и говоришь мол эй чувак ты можешь срать в мою консольку - демон открывает второй буфер (первый напомню просто в текстовый файл журналирует) и одно эхо летит сразу в два направления. отлично. это пример байпасных буферов. зачем чистить? ну для начала давайте подумаем, а нужные ли нам данные там лежат? старт скрипта, повесили буфер, накидали в него мусора. потом дошли до какого-то момента и решили что сценарий должен завершиться другими данными. закрыли-удалили буфер и вывели нужные данные. можно просто очистить буфер, вывести данные (они поймаются буфером) и потом завершить буфер выводом в поток. всё в данном случае зависит от того как программист решил работать с выходным потоком. ну и умеет ли он вообще работать с потоками. и понимает ли вообще что-нибудь в алгоритмах.
[vs], для break через два уровня можно написать Код (PHP): break 2; и т.д. исключения всё-таки для обозначения нештатной ситуации, не допускающей нормального завершения. а break это просто выход из цикла. абсолютно разный смысл (и цена выполнения, кстати. исключения до́роги).
artoodetoo, а если в цикле вызывается метод-метод-метод-метод и в котором еще есть циклы? брейк2 дойдет до выхода из своего скоупа и что увидит? а исключение дальше полетит пока мы его не поймаем. всё же исключения не жестко для нештатных ситуаций а для гибкой работы со вполне себе штатными ситуациями. по поводу производительности не буду спорить.
само слово "исключение" как бы неслучайно ))) ru.wikipedia.org/wiki/Обработка_исключений у микроскопа тоже бывает нестандартное применение, только зачем таким вещам учить топикстартера?! [vs] , ErrorException придуман как аналог классической пхпшной "ошибки". пример из доков: Код (PHP): <?php function exception_error_handler($errno, $errstr, $errfile, $errline ) { throw new ErrorException($errstr, $errno, 0, $errfile, $errline); } set_error_handler("exception_error_handler"); в SPL описано еще с десяток разных исключений, это совсем не значит, что корневой класс Exception это что-то безобидное, вроде break. )))