Ответ 1
Возвращает логическое значение для выполнения каждого этапа до успешного завершения.
while (condition) {
if ($this->phase1() || $this->phase2() || $this->phase3() || $this->phase4()) {
// Success!
}
}
Спаси меня от смерти хищника - есть ли лучший способ справиться с такой структурой?
while(condition) {
$this->phase1();
$this->phase2();
$this->phase3();
$this->phase4();
}
В любом из этих методов условие может быть выполнено. НЕМЕДЛЕННО после выполнения условия, цикл ДОЛЖЕН выйти. Если бы я мог называть break;
внутри phase2();
, например, мне не понадобился бы оператор goto (но, конечно, это вызвало бы ошибку).
Возвращает логическое значение для выполнения каждого этапа до успешного завершения.
while (condition) {
if ($this->phase1() || $this->phase2() || $this->phase3() || $this->phase4()) {
// Success!
}
}
Или вы можете использовать шаблон состояния!
В заключение, вместо того, чтобы иметь инструкцию goto, измените внутреннее состояние $this
так, чтобы методы phase1
, phase2
, phase3
и phase4
не имели эффекта и являются пустыми функциями. Поскольку они будут пустыми функциями, вы будете летать прямо через em и выйти из цикла!
Вероятно, вам также понадобится пинч событий или Observer, чтобы узнать, когда менять состояние.
Возвращает логическое значение из разных фаз. Я бы вернул false
, если это не удалось, затем проверьте это и break
.
Выбросить исключение... звучит необычно...
try {
while(condition) {
$this->phase1();
$this->phase2();
$this->phase3();
$this->phase4();
}
} catch (Exception $e) { }
Как обернуть каждую фазу в if
:
while(condition)
{
if(condition)
{
$this->phase1();
}
if(condition)
{
$this->phase2();
}
if(condition)
{
$this->phase3();
}
if(condition)
{
$this->phase4();
}
}
Конечно, это, возможно, было бы более компактным с небольшим количеством планирования и цикла.
Одним из способов может быть использование операторов if()
для проверки возвращаемого значения из каждого phase*()
и разрыва цикла while.
Что-то вроде этого:
while (condition) {
if ($this->phase1()) { break; }
}
Пожалуйста, не используйте инструкцию goto, подумайте о кодере, который будет использовать вашу базу кода
Если ваше условие не слишком много накладных расходов, вы можете
while(*condition*){
$this->phase1();
if (*condition*){
$this->phase2();
}
...
}
$phases=array('phase1','phase2','phase3','phase4');
foreach($phases as $phase){
$this->$phase();
if(condition)break;
}
Кроме того, вы можете использовать исключения, если хотите выйти изнутри функции.