X   Сообщение сайта
(Сообщение закроется через 3 секунды)



 

Здравствуйте, гость (

| Вход | Регистрация )

Открыть тему
Тема закрыта
> Функция switch не прерывается операторами break, return
Emperial
Emperial
Topic Starter сообщение 11.7.2019, 15:49; Ответить: Emperial
Сообщение #1


Здравствуйте, уважаемые участники форума,

Есть функция валидации почтового индекса в зависимости от выбранной пользователем страны. По умолчанию (под default) берутся официальные данные о формате индексов из официальных источников. Но, если нужно другое правило (к примеру, для Латвии опустить LV перед 4 цифрами индекса, и принимать только цифры), создаётся Case LV.

Проблема следующая: при добавлении кейса функция после получения TRUE для Латвии всё равно применяет и дефолтное правило тоже. С учётом того, что правила из кейса и из источника, куда обращается дефолт, разные, то любое значение будет забраковано.

Код
  
public function isPostalCodeValid($country_code, $postal_code) {
    switch ($country_code) {
      
      case 'LV':
        return (bool) preg_match('/^[0-9]{4}$/', $postal_code);
        break;
        
      case 'IL':
        return (bool) preg_match('/^[0-9]{7}$/', $postal_code);
        break;

        default:
        $addressFormatRepository = new AddressFormatRepository();
        
        $addressFormat = $addressFormatRepository->get($country_code);
        if (in_array(AddressField::POSTAL_CODE, $addressFormat->getUsedFields())) {
        $postal_code_pattern = $addressFormat->getPostalCodePattern();
        return (bool) preg_match('/^' . $postal_code_pattern . '$/', $postal_code);
        }
        else {
        return NULL;
        }    
    }
  }


Как завершать функцию досрочно, если получено TRUE из кейса, чтобы всегда применялось только одно правило валидации? Почему ни return, ни break не работают??
0
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
x64
x64
сообщение 11.7.2019, 16:06; Ответить: x64
Сообщение #2


Цитата(Emperial @ 11.7.2019, 14:49) *
Почему ни return, ни break не работают?

Как Вы это определяете?

$country_code точно содержит LV, а не lv/Lv/lV/lv без пробелов и прочего?
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Emperial
Emperial
Topic Starter сообщение 11.7.2019, 17:37; Ответить: Emperial
Сообщение #3


Цитата(x64 @ 11.7.2019, 23:06) *
Как Вы это определяете?

$country_code точно содержит LV, а не lv/Lv/lV/lv без пробелов и прочего?


x64, определяю следующим образом:

Без "case 'LV':" в коде функции я введу значение "LV-2016", и его примет. Добавив кейс, это значение станет невалидным для Латвии. Следовательно, правило работает. Далее, после добавления кейса при использовании "2016", его не примет. Следовательно, теперь применяются и прежнее, и новое правило.

Возьмём Израиль. Дефолтное правило допускает индексы из 5 чисел или из 7. Добавив case IL на 7 чисел, форма станет принимать только 7. Значит, тем более, кейс работает, и формат кода стран верный. Здесь, в отличие от накладки с Латвией, не возникло проблем, так как частное правило сужает общее, а не заменяет его.
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
icoder
icoder
сообщение 13.7.2019, 22:22; Ответить: icoder
Сообщение #4


Emperial, в switch case должно быть полное совпадение строки.

Замечание модератора:
Эта тема была закрыта автоматически ввиду отсутствия активности в ней на протяжении 100+ дней.
Если Вы считаете ее актуальной и хотите оставить сообщение, то воспользуйтесь кнопкой
или обратитесь к любому из модераторов.


--------------------
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Открыть тему
Тема закрыта
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0


Свернуть

> Похожие темы

  Тема Ответов Автор Просмотров Последний ответ
Открытая тема (нет новых ответов) SWITCH - антидетект браузер для ведения мультиаккаунтов
4 Cialis 4577 28.5.2021, 14:56
автор: Cialis
Открытая тема (нет новых ответов) Не срабатывает функция flush. Отключение буфферизации.
2 bombei 7138 3.9.2014, 22:23
автор: -Arks-
Открытая тема (нет новых ответов) функция "mysql_real_escape_string" выдаёт ошибки!
19 Panich 12637 25.5.2011, 13:57
автор: -Panich-
Открытая тема (нет новых ответов) Функция задержки
3 people2010 6679 20.8.2010, 5:37
автор: -Alcorn-


 



RSS Текстовая версия Сейчас: 19.4.2024, 16:32
Дизайн