Как выйти из блока кода 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, по своей сути не является злом. Это сводится к тому, как вы его используете.