В операторе IF в PHP с OR, как отследить, какое условие оценивается как ложное? - PullRequest
3 голосов
/ 19 июня 2011

например, в коде PHP, как это:

if($this->function1() && $this->function2())
{
  //everything is alright
}
else
{
  //function1 or function2 returned false
  //whodunnit?
}

Существует ли языковая конструкция или что-то, что может помочь мне найти виновника в блоке else ? Я не хочу снова выполнять условия, просто чтобы выяснить, что пошло не так.

Пожалуйста, имейте мой псевдокод. Мой настоящий код будет выглядеть совершенно неконтролируемым здесь ... и я, кстати, использую CodeIgniter.

Ответы [ 5 ]

8 голосов
/ 19 июня 2011
if($this->function1()) {
    if($this->function2()) {
        // both worked
    } else {
        // function1 returned a true value
        // function2 returned a false value
    }
} else {
    // function1 returned a false value
    // (you could optionally call $this->function2() here)
}

или, если вы всегда хотите запустить обе функции:

$result1 = $this->function1();
$result2 = $this->function2();
if($result1 && $result2) {
    // everything is okay
} else {
    // look at the results to figure out what to do
}

или, если вы хотите сделать первый, но без 2 уровней отступа:

if(!$this->function1()) {
    // function1 returned false
    // (you can call $this->function2() here if you want)
} elseif (!$this->function2()) {
    // function2 returned false
} else {
    // everything is okay
}
2 голосов
/ 19 июня 2011

Я хочу использовать имя функции, вызвавшей ошибку.

Это несколько уродливо.Я бы не использовал его (= "для этой цели").
Также я делаю этот CW, чтобы избежать отрицательных голосов.

 if ($this->function1($failed="func1") && $this->function2(.., $failed="func2")) {
    ...
 }
 else {
    print $failed;

Этот синтаксический обходной путь требует, чтобы вы могли заполните параметры метода требуемым числом и передайте ложный параметр $failed в неиспользуемое место.Фактически он просто добавляет эту переменную в область видимости локальной переменной.

Вы можете переработать это выражение if более неуклюже, добавив больше && ands и () паренсов к тому же эффекту.Это просто несколько компактно.Тем не менее, я не уверен, понимаю ли я, почему вам нужна строка с ошибочным именем функции, а не просто логическое значение, или что с фобией if.

1 голос
/ 05 октября 2011
try{
    functionA();
    functionB();
}catch(YourExceptionType $e){
    //use $e to know what, where, and why it happened
}

Вот что я бы сделал

и если вы не генерируете исключения, вы можете использовать «или», потому что когда функция истинна, вторая часть или никогда не будет запущена:

functionA() or somethingWentWrong();
functionB() or somethingWentWrong();

но я все еще рекомендую попробовать / поймать

1 голос
/ 19 июня 2011

Самое простое решение: сохранить результаты обеих функций в переменных и проверить их в своем условии if.

0 голосов
/ 19 июня 2011

Вы можете использовать временные переменные в самом if:

if ($f1=$this->function1() and $f2=$this->function2()) {

Затем проверьте их.

Обратите внимание, что я заменил && на and, чтобы избежать лишних скобок( and имеет более низкий приоритет, чем присвоение ).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...