Потеря переменной в двойной конструкции switch

Рейтинг: -1Ответов: 1Опубликовано: 02.04.2015

Здравствуйте.

Есть "двухэтажная" конструкция switch

    switch ($p){
       default: 
         switch ($m){
           case 'some':
    // somecode
             $var = "foo";
           break;
    // somecode
         }
         break;
    //somecode
  }

В результате исолнения кода в switch($m) "теряются" переменные. Т.е. при дальнейшем их использовании они становятся null , хотя явно обозначаются как $var = "foo"

В чем может быть дело? Это нормальное поведение подобных конструкций или что? Ибо без нее в данном случае - никак.

Проблемная часть

case 'faq': 
     $title = " - F.A.Q";
      switch($_GET['mode']){ 
        default: 
          $title = "BRS F.A.Q"; 
         echo $tpl->result['head']; 
         break; 
         case 'auth_key': break; 
       } 
  break;

Теряется $title. Собственно в остальных случаях, где нет подконструкции, всё корректно исполняется.

Ответы

▲ 2Принят

Так и не понял где и что у вас теряется. Вот несколько тестов:

function test($p, $m) {
    $title = 'default';
    switch ($p) {
        case 'faq':
            $title = " - F.A.Q";
            switch ($m) {
                default:
                    $title = "BRS F.A.Q";
                    break;
                case 'auth_key':
                    break;
            }
        break;
    }
    return $title;
}

echo test('faq', 'auth_key') . "\n";        // ' - F.A.Q'
echo test('faq ', 'auth_key') . "\n";       // 'default'
echo test('faq', 'auth_key2') . "\n";       // 'BRS F.A.Q'
echo test('faq2', 'auth_key') . "\n";       // 'default'
echo test('faq2', 'auth_key2') . "\n";      // 'default'

Все выводит как и ожидается, нигде ничего не теряется. Там, где выводит default - так и должно вводить, т.к. не срабатывает ни один case.

Соответственно, если вы где-то что-то потеряли, значит либо у вас где-то логика хромает, либо исходные данные не совпадают с вашими ожиданиями.