Оператор php andif проваливается

С риском винить себя до мозга костей, все же задаюсь вопросом: Есть ли что-то вроде "andif" в php или как можно элегантно решить нижеприведенное?

Сценарий: сначала проверьте, если это так, выполните некоторую обработку (например, свяжитесь с сервером), затем проведите второй тест, сделайте что-нибудь... проведите третий тест, а затем выполните результат или - если что-то из вышеперечисленного не удается - всегда выводить тот же провал.

Вместо того, чтобы каждый раз повторять оператор else...

if ( ....) { 
        contact server ...
        if (  ...  ){
        check ...       
            if (  ... )   {
                success  ;
            } else {  failure ...       }
        } else {  failure ...       }
} else {  failure ...       }

.. Я ищу что-то вроде этого:

if ( ...) {
   do something...
   andif ( test ) {
      do something more ...
      andif ( test) {
         do }
else { 
   collective error }

В функции я могу использовать симуляцию «провала» с возвратом в случае успеха:

function xx {
 if {... if {... if {...  success; return; }}}
 failure
}

.. а в основной программе?


person user30424    schedule 23.12.2017    source источник
comment
Вы можете использовать try и catch, где вы создаете исключение, если что-то пойдет не так.   -  person Mikey    schedule 23.12.2017


Ответы (3)


В PHP нет оператора andif, но вы можете использовать идиому раннего возврата (или «fail-fast») и возвращать ошибку всякий раз, когда тест не проходит. Таким образом, вам не нужна куча else:

function xx {
    if (!test1) {
        return failure;
    }

    someProcessing();
    if (!test2) {
        return failure;
    }

    // Etc...

    return success;
}
person Mureinik    schedule 23.12.2017
comment
если в функции вы можете сделать «провал». См. выше. - person user30424; 23.12.2017

Я бы сначала проверил на ошибку:

if (not_true) {
    return;
}

connect_server; 

if (second_not_true) {
    return;
}

check;

И так далее...

Вы также можете выполнить множественную проверку в одном выражении if с помощью логических операторов. Например :

if (test && second_test && third_test) { // means if test is true and if second_test is true and if third_test is true
    // do the stuff if success...
} else {
    // do the stuff if errors...
}
person JazZ    schedule 23.12.2017
comment
@ user30424 Вы слышали о && ? - person JazZ; 23.12.2017
comment
дело в том, что я хочу связаться с сервером сразу после успешного первого теста. Конечно, я мог бы собрать все данные с сервера, а затем использовать оператор &&. - person user30424; 24.12.2017
comment
Я понимаю. А как насчет die() вместо return? - person JazZ; 24.12.2017
comment
Или через исключение? - person JazZ; 24.12.2017

ну, так как в php нет такого понятия, как andif, я думаю, что единственный способ сделать это - задержать дыхание: GOTO (извините за испорченное рождество...)

   if  ( ....) { 
            contact server ...
            if (  ...  ){
            check ...       
                if (  ... )   {
                    success  ;
                    goto success;
                 }}}
    failure;
    success:
    continue...

все остальное мне кажется сложнее.

person user30424    schedule 24.12.2017