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



 

Здравствуйте, гость ( Вход | Регистрация )

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


Частый гость
**

Группа: User
Сообщений: 63
Регистрация: 11.7.2011
Из: Хабаровск
Поблагодарили: 10 раз
Репутация:   2  


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

Есть функция валидации почтового индекса в зависимости от выбранной пользователем страны. По умолчанию (под 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


F.A.L.L.O.U.T.
*******

Группа: Super Moderator
Сообщений: 3755
Регистрация: 30.6.2011
Из: Железнодорожный (Балашиха)
Поблагодарили: 3134 раза
Репутация:   311  


Цитата(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


Частый гость
**

Группа: User
Сообщений: 63
Регистрация: 11.7.2011
Из: Хабаровск
Поблагодарили: 10 раз
Репутация:   2  


Цитата(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


Новичок
*

Группа: User
Сообщений: 27
Регистрация: 14.6.2019
Поблагодарили: 4 раза
Репутация:   0  


Emperial, в switch case должно быть полное совпадение строки.
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Открыть тему
Добавить ответ в эту тему
Быстрый ответ
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0


 



RSS Текстовая версия Сейчас: 23.7.2019, 0:59
Дизайн