Подтвердить что ты не робот

Я собираюсь использовать инструкцию goto

Спаси меня от смерти хищника - есть ли лучший способ справиться с такой структурой?

while(condition) {
    $this->phase1();
    $this->phase2();
    $this->phase3();
    $this->phase4();
}

В любом из этих методов условие может быть выполнено. НЕМЕДЛЕННО после выполнения условия, цикл ДОЛЖЕН выйти. Если бы я мог называть break; внутри phase2();, например, мне не понадобился бы оператор goto (но, конечно, это вызвало бы ошибку).

4b9b3361

Ответ 1

Возвращает логическое значение для выполнения каждого этапа до успешного завершения.

while (condition) {
    if ($this->phase1() || $this->phase2() || $this->phase3() || $this->phase4()) {
        // Success!
    }
}

Ответ 2

Или вы можете использовать шаблон состояния!

В заключение, вместо того, чтобы иметь инструкцию goto, измените внутреннее состояние $this так, чтобы методы phase1, phase2, phase3 и phase4 не имели эффекта и являются пустыми функциями. Поскольку они будут пустыми функциями, вы будете летать прямо через em и выйти из цикла!

Вероятно, вам также понадобится пинч событий или Observer, чтобы узнать, когда менять состояние.

Ответ 3

Возвращает логическое значение из разных фаз. Я бы вернул false, если это не удалось, затем проверьте это и break.

Ответ 4

Выбросить исключение... звучит необычно...

try {
    while(condition) {
        $this->phase1();
        $this->phase2();
        $this->phase3();
        $this->phase4();
    }
} catch (Exception $e) { }

Ответ 5

Как обернуть каждую фазу в if:

while(condition)
{
  if(condition)
  {
    $this->phase1();
  }

  if(condition)
  {
    $this->phase2();
  }

  if(condition)
  {
    $this->phase3();
  }

  if(condition)
  {
    $this->phase4();
  }
}

Конечно, это, возможно, было бы более компактным с небольшим количеством планирования и цикла.

Ответ 6

Одним из способов может быть использование операторов if() для проверки возвращаемого значения из каждого phase*() и разрыва цикла while.

Что-то вроде этого:

while (condition)   {
    if ($this->phase1())   { break; }
}

Ответ 7

Пожалуйста, не используйте инструкцию goto, подумайте о кодере, который будет использовать вашу базу кода

Если ваше условие не слишком много накладных расходов, вы можете

while(*condition*){
    $this->phase1();
    if (*condition*){
       $this->phase2();
    }

    ...

} 

Ответ 8

$phases=array('phase1','phase2','phase3','phase4');
foreach($phases as $phase){
    $this->$phase();
    if(condition)break;
}

Кроме того, вы можете использовать исключения, если хотите выйти изнутри функции.