Я пишу какой-то анализатор кода для PHP и ищу реальные примеры использования инструкции «goto» в фреймворках / скриптах.
Пока я нашел только некоторые предельное использование в наборе тестирования Symfony.
Кажется, что эта языковая функция вообще не используется в пользовательском пространстве? Или это где-то существует?
Недавно я начал работать у нового работодателя, унаследовавшего унаследованный PHP частичный OO и частичный фреймворк MCV. На некоторых страницах представления выполняли большую часть бизнес-логики, фактически ничего не отображая; каждый раз, эти плоские файлы PHP были включены (а не include_once()
) и так получилось, что многие части сайта были спагетти и скриптами типа фрикадельки (что-то, что GOTO
должен производить так считается плохой практикой).
То, что происходило, было то, что некоторая логика срабатывает (потому что она была включена несколько раз и в нескольких местах), когда это не нужно, и создает журналы ошибок, потому что, возможно, одна строка или одна IF
Блок операторов требовался во всем файле из сотен строк PHP.
Создание конечной точки и добавление в goto END;
был хорошим промежуточным шагом к сокращению журналов ошибок и предотвращению запуска этих битов скрипта, когда они не нужны. Например:
if(empty($userRequest)){
goto END;
}
## The rest of the script from this point needs to fire until...
if(empty($_REQUEST['user_id'])){
goto END;
}
## etc...
Конечно, это только промежуточный шаг, чтобы фактически уменьшить количество спагетти. Я также перенес некоторую необходимую функциональность в классы контроллеров, где это было практично (и создал модели, в которых предполагаемые файлы представлений выполняли моделирование данных).
Я мог бы добавить в IF...ELSE
блоки операторов для достижения тех же результатов, но количество логики в скрипте (и количество вложенных IF
заявления и т.д …) означало, что добавление в goto END;
фактически сделал сценарий более читабельным, в то время как происходили другие рефаторинг.
В конце концов, когда я распутаю все старые спагетти, я удалю GOTO
заявления и сделать его полностью MVC и OO, как это должно быть.
Вот пример использования goto
:
<?php
ten:
print "Hello ";
goto ten;
Вы правы, это почти никогда не используется в программировании на PHP, потому что мудрость современного программирования говорит, что это приводит к «спагетти-коду», который труднее отлаживать.
Тем не менее, попробуйте не использовать безусловные циклы (что к чему goto
на самом деле есть) на языках машинного уровня. Я помню, как несколько лет назад использовал безусловные циклы со сборкой MIP.
Других решений пока нет …