Задать вопрос
@mrgyf1

Области видимости переменных из разных case внутри одного switch (PHP)?

Приветствую! Прошу помощи в написании бота с целью принятия от пользователя логина и пароля, далее помещения этих данных в переменные и передачи в соответствующую функцию, которая свяжется с внешней системой JSONом
Бот использует webHook.
Столкнулся с проблемой, что переменные $login и $password не видны из разных case

function processMessage($data){
    $message = isset($data->message) ? $data->message : null;
    $chat_id = isset($message->chat->id) ? $message->chat->id : null;
    $text = isset($message->text) ? $message->text : null;
    $user_id = isset($message->from->id) ? $message->from->id : null;
    $status = getUserInfo($user_id, 'status');
    $verified = getUserInfo($user_id,'verified');
    switch ($text){
        case '/start':
            if ($verified == 0 && $status==0){ //Проверка на наличие связи user_id и внешней системы
                send('sendMessage', array('chat_id'=>$chat_id, 'text'=>'Вы не зарегистрированный пользователь. Представьтесь, указав последовательно Логин и Пароль!'));
                setStatus($user_id, 1); //waiting for login
            }
    }
    switch ($status) {
        case 1:
            $login= $text; // Принимает и записывает логин
            send('sendMessage', array('chat_id' => $chat_id, 'text' => 'Теперь укажите пароль'));
            setStatus($user_id, 2); //waiting for password
            break;
        case 2:
            $password = $text; // Принимает и записывает пароль
            setStatus($chat_id, 3); 
            break;
        case 3: //Использует логин и пароль. Связывается с внешней системой и в ответ получает массив
            $result = getUserFromMapAdmin($login, $password); //Получить логин и пароль из прошлых case и передать в функию, которая вернет массив
            break;
    }
}


$data = json_decode(file_get_contents('php://input'));
processMessage($data);
  • Вопрос задан
  • 719 просмотров
Подписаться 1 Оценить Комментировать
Решения вопроса 1
xpert13
@xpert13
Full Stack Developer
Тут дело не в том, что переменные в другом case не видны, а в том, что переменная локальная и после того, как $login или $password устанавливается происходит выход из функции.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
rusticus
@rusticus
Разработчик
Странный конечно код, непонятно зачем вам такой switch.
Break прекращает работу switch.
Ответ написан
Fortoo
@Fortoo
Top-Web OpenCart
Чтобы лучше понять "почему не видны переменные", нужно представить как думает машина и что switch

switch ($status) {
        case 1:
             //...
            break;
        case 2:
             //...
            break;
        case 3: 
            //...
            break;
    }


это подобие замены (когда используется break;) классического ветвления с использованием IF

if ($status == 1) {
    //...
} elseif ($status == 2) {
    //...
} elseif ($status == 3) {
    //...
} else { //это  замена default (не обязателен) из конструкций switch
    //...
}


Соответственно, если не выполнено (или выполнено) какое-то условие, то его не может увидеть другое условие, потому-что эти условия как-бы разорваны между собой.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы