2013-09-13 3 views
1

У меня есть оператор switch, который имеет дело с переменной $action, а затем загружает данные соответствующим образом. Тем не менее, давайте скажем, что определенное действие не представляется возможным, и было установлено в середине переключателя, например:switch() и изменение переменной

switch($action) 
{ 
    case "view": 
    if($id) { 
      // perform actions 
     } else { 
      $action = false; 
     } 
    break; 
    case "false": 
     // perform other actions 
    break; 
} 

Проблема заключается в том, что он кажется, что я не могу этого сделать. После того, как оператор switch был запущен, переменная, похоже, заблокирована в этом экземпляре.

Есть ли способ обойти это?

+0

Как насчет другой локальной переменной в 'else' части, которая будет вновь назначен на' $ action' в конце 'switch'? –

ответ

0

Не совсем. Есть обходные пути для конкретных случаев вы можете быть в состоянии использовать, например

case "view": 
    if ($id) { 
     // perform actions 
     break; 
    } 
    // intentional fall-through 
case "false": 
    // other actions 
break; 

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

switch(true) { 
    case $action == 'view' && $id: 
     break; 
    case $action == 'view' && !$id: 
     // intentional fall-through -- but you can now write many of these 
    case $action == 'false': 
     break; 
} 

Тем не менее, код, как это слишком необычно, чтобы быть написано безнаказанно. Когда прямой switch кажется недостаточным, я рекомендую сделать шаг назад и попытаться реорганизовать код, вместо того, чтобы пытаться перевести переключатель в подчинение.

+0

Обратите внимание, что первый тип кода (пропущенные перерывы в корпусе) не очень удобен в обслуживании и может привести к тонким ошибкам. –

+0

@StevenLiao: Второй тип еще хуже. ;-) – Jon

+0

не видел ваш текст редактирования, только ваш начальный случай. Я думаю, мы были в согласии, прежде чем я начал набирать xD. –

1

Вы можете использовать какую-либо форму рекурсии с включенным переключателем в функции, в зависимости от того, что вам нужно в инструкции switch и что вы делаете.

Например:

function myFunction($action){ 
    switch($action) 
    { 
    case "view": 
     if($id) { 
      // perform actions 
     } else { 
      myFunction(false); 
     } 
    break; 
    case "false": 
     // perform other actions 
    break; 
    } 

} 

Я согласен с другой ответ, хотя, это выглядит, как он выйдет из-под контроля. Возможно, рефакторинг - лучшее решение.

+0

Мне это действительно нравится. Его вид вне коробки. – Chud37

1

В этом сценарии я бы избежал использования корпуса коммутатора. напишите некоторые методы обработки этих сценариев.
например

if(isActionSucessful($action)) //checks if $action == view 
    performYourActions($id); // check if $id is ok, if not then call cleanup; 
else 
    performCleanupActions() ..; 

обычно проваливаются случаев и переключатель не так ясно для читателей - вы должны поставить дополнительный комментарий, что это действительно намеренно.

1

Лучшая практика для случая (помиловать каламбур), как это было бы, чтобы пересмотреть вашу логику.

Что-то вроде этого было бы намного яснее.

switch ($action) 
{ 
    case "view": 
     do_view($id); 
     break; 
    case "something_else": 
     //... 
} 

function do_view($id) 
{ 
    if ($id) 
    { 
     do_action_success(); 
    } 
    else 
    { 
     do_action_false(); 
    } 
} 
+0

Я пошел с удалением 'case false:' из 'switch' и помещал его в' if {} ' – Chud37

-1

попробовать что-то вроде этого:

$action = "view"; 
$id = false; 
callswitch($action,$id); 
function callswitch($action,$id){ 
switch($action) 
{ 
    case "view": 
     if($id) { 
      echo 'inside case view';  
      break; 
     } else { 
      callfunc();     
      break; 
     }  
    case "false": 
     echo 'inside case false'; 
    break; 
} 
} 

function callfunc(){ 
    $action = "false"; 
    $id = true; 
    callswitch($action,$id); 
} 
+0

. Просьба представить объяснение с вашим кодом. – RedEyedMonster

Смежные вопросы