Как выйти из блока кода PHP?
В PHP можно ли выйти из блока кода PHP (т.е. тегов PHP)?
<?php
if (!A) phpexit();
print("1");
?>
<?php
print("2");
?>
Итак, если A
было истинным, тогда результат 12
, а если A
был ложным, то результат 2
.
Я знаю, что вы можете сделать это с помощью инструкции if или что-то еще, но я хочу знать, есть ли какая-то специальная функция PHP, которая может это сделать.
Ответы
Ответ 1
Существует оператор goto
, но я настоятельно рекомендую использовать такие трюки ( "код спагетти" ). Вам лучше использовать структурированные блоки if
, с ними нет ничего плохого.
Перед использованием goto
рассмотрите альтернативные решения: например, вы можете использовать include
разные сценарии в зависимости от условия A
.
![enter image description here]()
Ответ 2
Возможны два решения:
1) меньше hacky
укажите код, который у вас есть в блоке в отдельных файлах. Вы можете использовать return
в них, чтобы остановить обработку включенного файла
//file1.php
if (!A) return;
print("1");
// file2.php
print("2");
<?php include "file1.php";?>
<?php include "file2.php";?>
2) больше hacky (другие, вероятно, убьют меня)
Поместите блок в блок do { ... } while(false);
и сломайте его
<?php do {
if (!A) break;
print("1");
} while(false); ?>
<?php do {
print("2");
} while(false); ?>
Ответ 3
Нет, нет. Но что вы можете сделать, это поместить метку в конце каждого блока, а затем использовать goto
(не рекомендуется, но если вы не хотите большой if
... (ps: см. Ответ @gd1 as подсказка здесь; -P)).
<?php
if (!A) goto exit_1;
print("1");
exit_1: ;
?>
<?php
print("2");
exit_2: ;
?>
Ответ 4
Если это ни что иное, кроме эксперимента, вы делаете это неправильно. Остановите выполнение ориентированной на потребности программирования, так как начните обучение ООП.
Ну... вы всегда можете обернуть содержимое <?php ?>
анонимной функцией;
<?php $f = function () use (&$a) {
if ($a)
{
echo 1;
return;
}
echo 2;
};$f(); ?>
<?php $f = function () {
echo 2;
};$f(); ?>
Это будет работать в PHP 5.3+. И если вам нужно обмениваться переменной, вы можете ввести их в область с помощью оператора use()
в определении.
Но позвольте мне повторить:
Если вы хотите сделать что-то подобное в производственном коде, вы делаете это неправильно.
Ответ 5
Если вы уважаете культуру поп-культуры слишком много и чувствуете, что вам нужно вписаться (и получить популярность!), вот решение без goto
:
<?php
call_user_func(function() {
if (!A) return;
print("1");
});
?>
<?php
print("2");
?>
Ответ 6
Нет, и это не имеет смысла. Представьте, что вы могли бы сделать это, и у вас был этот фрагмент кода:
<?php
if (!A) phpexit();
if (B) {
?>
<b>Foo</b>
<?php
}
?>
<i>Baz</i>
Где бы phpexit()
перескочить? Блок then
if (B)
выпрыгивает из блока PHP, но вы не хотите переходить на <b>Foo</b>
с if (!A)
, правильно? Не было бы смысла прыгать в блок then
, не проверяя условие.
Как уже показал gd1, вы можете сделать это с помощью goto
, но это сделает ваш код неструктурированным. Вы бы очень усердно относились к себе (и будущим сопровождающим вашего кода), чтобы понять поток вашего кода, когда ваш код скачет повсюду.
В низкоуровневых языках (например, сборке) у вас есть только переходы для работы, но на более высоких языках вы абстрагируете их такими структурами, как if
, for
и while
. Они обеспечивают структуру, преднамеренно препятствуя вам прыгать куда угодно.
Ответ 7
Я столкнулся с несколькими ситуациями, когда остальная часть блока кода PHP должна быть пропущена из-за ошибки (ошибка подключения к базе данных, недопустимый ввод и т.д.). Как студент, мой профессор просто использует die
, который полностью прекращает разбор файла, оставляя страницу неполной, без нижнего колонтитула или даже тегов закрытия HTML </body></html>
. Даже если есть ошибка, нет причин для создания недействительного HTML, отключив закрывающие теги.
Конечно, чисто структурированный подход использовал бы операторы if
, и это предпочтительнее goto
в подавляющем большинстве ситуаций. Тем не менее, я чувствую, что если вы просто пытаетесь выпрыгнуть из блока кода PHP, размещение больших сегментов кода в структуре if
/else
довольно неэлегантно и может на самом деле сделать код более понятным, чем просто использовать a goto
, который перескакивает до самого конца блока PHP непосредственно перед ?>
, так как становится трудно вспомнить, что целая куча кода на самом деле является частью условного оператора 50+ строк ниже if
или elseif
.
Все говорят, что утверждения goto
плохие, но для goto
существуют допустимые значения, которые делают код более понятным, например, выпрыгивая из глубоко вложенных структур управления и перескакивая до конца кода кода PHP ( учитывая, что для этого не существует встроенной языковой конструкции).
Конструкция кода, подобная goto
, по своей сути не является злом. Это сводится к тому, как вы его используете.