Сейчас я расскажу об одном случае, когда применение меток в PHP приносит много пользы. Приберегите свои тухлые помидоры и какашки — даже не смотря на то, что речь пойдет о всем известном и ненавистном goto.
Если вы не очень знаете, что такое метки (или совсем забыли — штука эта редко кому нужна), то для начала обратитесь к документации PHP по этому вопросу.
Итак, к сути. Представим, что у нас на руках такой вот кусок кода:
// У нас на входе есть массив пользователей. Перебираем
// пользователей
// в цикле и запрашиваем для каждого пользователя данные у
// внешнего
// api сервиса
foreach($users as $user) {
try {
// делаем запрос по сети к API серверу
$apiResponse = $api->request('api.method', $user['id']);
if(empty($apiResponse)) {
// По неизвестной причине ответа нет — вбрасываем // исключение
throw new ApiException('Request Error');
} else {
// Ответ есть — обрабатываем его дальше
}
} catch (ApiException $ae) {
// вызываем метод для обработки исключения при ошибке
$ae->method();
}
}
А теперь посмотрите на этот код минут и 5 подумайте над следующим вопросом: как сделать так, чтобы после вызова обработчика исключения скрипт возвращался и повторял запрос к API серверу для пользователя, у которого этот запрос не прошел.
Серьезно — подумайте минут 5. Мысленно оцените простоту и понятность всех способов, которые пришли к вам в голову.
Теперь поговорим о goto. Да, говорят, это плохо. Говорят, что за это нужно сажать на кол. Но смотрите:
// У нас на входе есть массив пользователей. Перебираем
// пользователей
// в цикле и запрашиваем для каждого пользователя данные у
// внешнего
// api сервиса
foreach($users as $user) {
try {
// делаем запрос по сети к API серверу
apiRequest:
$apiResponse = $api->request('api.method', $user['id']);
if(empty($apiResponse)) {
// По неизвестной причине ответа нет — вбрасываем
// исключение
throw new ApiException('Request Error');
} else {
// Ответ есть — обрабатываем его дальше
}
} catch (ApiException $ae) {
// вызываем метод для обработки исключения при ошибке
$ae->method();
goto apiRequest;
}
}
Вот, теперь после сброса исключения с помощью двух строк мы снова можем легко повторить действия и запросить данные еще раз. В подобных случаях это — самый наглядный способ повторить сбойный участок кода.
Так что метки — не всегда плохо.