Урок 3. Конструкции if-else, switch-case в PHP
Теория
Конструкция if-else
Для того, чтобы напрограммировать что-нибудь полезное, 1 переменных далеко не достаточно. Нам нужен механизм, который позволит выполнять определенный код в зависимости от каких-либо условий.
Т.е. нам нужно иметь возможность спросить у PHP 'Если'.
Например так: если эта переменная <0, то вывести 'отрицательно', иначе (т.е. если она > 0) вывести 'положительно'.
В PHP для таких вопросов предназначена конструкция if, которая позволяет выполнять определенный код при выполнении какого-либо условия:
<?
if(логическое выражение){Этот код выполниться, если логическое выражение верно (т.е. равно true)}
else{Этот код выполнится, если логическое выражение неверно (т.е. равно false)}
?>
Обратите внимание на то, что блок else не обязателен.
Логическое выражение представляет собой тот самый вопрос, который мы хотим задать PHP. Например, чтобы спросить 'переменная $a > 0' мы напишем так: $a>0.
Примеры работы:
<?
$a=3;//Если переменная $a>0, то выведите 'верно', иначе (если < или =0) выведите 'неверно'
if($a>0){echo'Верно!';}else{echo'Неверно!';}//выведет 'Верно!'
?>
<?
$a=-3;//Если переменная $a> или = 0, то выведите 'верно', иначе (если <0) выведите 'неверно'
if($a>=0){echo'Верно!';}else{echo'Неверно!';}//выведет 'Неверно!'
?>
Сокращенный синтаксис
В случае, если в фигурный скобках if или else будет только 1 выражение, можно эти фигурные скобки не писать:
<?
//Полный вариант:
if($a==0){echo'Верно!';}else{echo'Неверно!';}
//Уберем скобки после if:
if($a==0)echo'Верно!';else{echo'Неверно!';}
//Уберем скобки после else:
if($a==0){echo'Верно!';}else echo'Неверно!';
//Уберем скобки и после if, и после else (обратите внимание на точку с запятой - она осталась):
if($a==0)echo'Верно!';else echo'Неверно!'
?>
Равенство по значению и типу
Для того, чтобы сравнить на равенство следует использовать оператор двойное равно ==, а не одиночное =, как можно было подумать.
Почему так? Потому что одиночное равно зарезервировано за присваиванием. Смотрите пример:
<?
$a=0;//Если переменная $a=0, то выведите 'верно', иначе (если не =0) выведите 'неверно'
if($a==0)echo'Верно!';else echo'Неверно!'//выведет 'Верно!'
?>
А следующий пример работать будет не так, как мы думаем:
<?
$a=0;//Мы думаем оно работает так: если переменная $a=0, то выведите 'верно', иначе (если не = 0) выведите 'неверно'. На самом деле оно работает так: переменной $a присвоить 1, если удалось присвоить - то выведите 'верно', иначе (если не удалось присвоить) выведите 'неверно'.
if($a=1)echo'Верно!';else echo'Неверно!'//всегда будет выводить 'Верно!'
?>
Кроме оператора == существует еще и оператор ===. Их различие в том, что === сравнивает не только по значению, но и по типу, а == сравнивает только по значению.
Чтобы полностью разобраться в этом, внимательно изучите примеры:
<?
$a='0';//переменная $a представляет собой строку, а не число 0
if($a==0)echo'Верно!';else echo'Неверно!'//Выведет 'Верно!', так как проверяется только значение, но не тип. Поэтому '0' равен 0.
?>
<?
$a='0';//переменная $a представляет собой строку, а не число 0
if($a===0)echo'Верно!';else echo'Неверно!'//Выведет 'Неверно!', так как строка '0' не = числу 0 при сравнении по типу.
?>
Не равно
Для того, чтобы спросить 'не равно', существует операторы != и !==. 1-й игнорирует различие в типах, а 2-й - нет.
<?
$a=0;//Если переменная $a не =0, то выведите 'верно', иначе (если не =0) выведите 'неверно'
if($a!=0)echo'Верно!';else echo'Неверно!';//выведет 'Верно!', так как $a равно 0
?>
<?
$a=1;//Если переменная $a не =0, то выведите 'верно', иначе (если не =0) выведите 'неверно'
if($a!=0)echo'Верно!';else echo'Неверно!';//выведет 'Неверно!', так как $a равно 0
?>
<?
$a='0';//Если переменная $a не =0, то выведите 'верно', иначе (если не =0) выведите 'неверно'
if($a!=0)echo'Верно!';else echo'Неверно!'//Выведет 'Неверно!', так как $a равно '0', а различие в типах игнорируется.
?>
<?
$a='0';//Если переменная $a не =0, то выведите 'верно', иначе (если не =0) выведите 'неверно'
if($a!==0)echo'Верно!';else echo'Неверно!'//Выведет 'Верно!', так как $a равно '0', а это не равно 0 при сравнении по типу.
?>
Все операции сравнения
Возможные операции сравнения, которые можно использовать внутри if:
$a==$b $a равно $b
$a===$b $a равно $b и они одинаковы по типу
$a!=$b $a не равно $b
$a!==$b $a не равно $b или $a равно $b, но они разные по типу
$a<$b $a<$b
$a>$b $a>$b
$a<=$b $a < или равно $b
$a>=$b $a> или равно $b
Функция empty
Зачастую в веб-программировании возникает следующая проблема: необходимо проверить переменную на пустоту.
Переменная будет пустая, если она =0, '' (пустой строке), false или null (т.е. не определена ранее).
Проверка на пустоту выполняется с помощью функции empty():
<?
$a=null;//Если $a пустое, то…
if(empty($a))echo'Верно!';else echo'Неверно!'//выведет 'Верно!'
?>
<?
$a=0;//Если $a пустое, то…
if(empty($a))echo'Верно!';else echo'Неверно!'//выведет 'Верно!'
?>
<?
$a='';//Если $a пустое, то…
if(empty($a))echo'Верно!';else echo'Неверно!'//выведет 'Верно!'
?>
<?
$a='hi';//Если $a пустое, то…
if(empty($a))echo'Верно!';else echo'Неверно!'//выведет 'Неверно!', так как $a не пустая
?>
Чаще возникает обратная задача - проверка на то, что переменная является не пустой. Отрицание не можно сделать с помощью оператора '!':
<?
$a=null;//Если $a Непустое, то…
if(!empty($a))echo'Верно!';else echo'Неверно!'//выведет 'Неверно!', так как $a пустое
?>
Функция isset
Аналогом empty является функция isset. Она проверяет существует ли переменная (т.е. то, что она не = null). Смотрите примеры:
<?
$a='hello';//Если $a существует, то…
if(isset($a))echo'Верно!';else echo'Неверно!';//Выведет 'Верно!', так как $a существует.
?>
<?
$a=0;//Если $a существует, то…
if(isset($a))echo'Верно!';else echo'Неверно!'//Выведет 'Верно!', так как $a существует.
?>
<?//Пусть переменную $a вообще не определяли выше в коде (это все равно, что присвоить ей null). Если $a существует, то…
if(isset($a))echo'Верно!';else echo'Неверно!'//выведет 'Неверно!'
?>
Аналогично проверятся на не существование (через !isset):
<?
$a=3;//Если $a не существует то…
if(!isset($a))echo'Верно!';else echo'Неверно!'//Выведет 'Неверно!', так как $a существует.
?>
Несколько условий сразу: or и and
Иногда может быть нужно составить какое-то сложное условие, например, пользователь вводит месяц своего рождения и вам нужно проверить, что введенное число > или равно 1 и < либо равно 12 (так как в году 12 месяцев).
Для этого существуют операторы and (логическое И) и or (логическое ИЛИ).
<?
$a=3;
$b=-3;//Если $a>0 и $b одновременно <0 то…
if($a>0 and $b<0)echo'Верно!';else echo'Неверно!';//выведет 'Верно!'
$a=3;//Если $a> или =1 и < или =12 то…
if($a>=1 and $a<=12)echo'Верно!';else echo'Неверно!';//выведет 'Верно!'
$a=-3;
$b=-3;//Если $a>0 ИЛИ $b <0 - хотя бы 1 из них, то… выведет 'Верно!', так как хотя $a и не > 0, но 1 из условий - $b<0 - выполнится!
if($a>0 or $b<0)echo'Верно!';else echo'Неверно!'
?>
Вместо and можно писать &&, а вместо or - ||.
Работа с логическими переменными
Многие функции PHP в результате своей работы возвращают либо true (истина), либо false (ложь). Эти значения довольно удобны при своей работе, но новичкам бывает довольно сложно понять их.
Представим себе, что переменная $a=true. В таком случае конструкцию if можно записать так:
<?
$a=true;//Если $a равно true, то…
if($a==true)echo'Верно!';else echo'Неверно!'//Выведет 'Верно!', так как $a равно true.
?>
Так как такие сравнения довольно распространены в PHP, то существует специальный прием, облегчающий работу (но не понимание, к сожалению).
Прием такой: конструкцию $a==true можно заменить на более простую: вместо if($a==true) написать if ($a) и она будет работать аналогично.
Следует пользоваться 2-й конструкцией, так как она проще.
<?//Заменим $a==true на более простую: вместо if($a==true) напишем if($a):
$a=true;//Если $a равно true, то…
if($a)echo'Верно!';else echo'Неверно!';//выведет 'Верно!', так как $a равно true
$a=true;//Если $a не true (т.е. false!), то…
if(!$a)echo'Верно!';else echo'Неверно!'//выведет 'Неверно!', так как $a равно true
?>
Также обратите внимание на следующие примеры:
<?//Данное выражение всегда будет выводить 'Верно'
if(true)echo'Верно!';else echo'Неверно!';
//Данное выражение всегда будет выводить 'Неверно'
if(false)echo'Верно!';else echo'Неверно!';
//Данное выражение всегда будет выводить 'Неверно'
if(!true)echo'Верно!';else echo'Неверно!';
//Данное выражение всегда будет выводить 'Верно'
if(!false)echo'Верно!';else echo'Неверно!';
?>
Работа вместе с HTML
PHP устроен таким образом, что его можно использовать в одном файле с HTML. Представьте, что у нас возникает такая задача: если пользователь авторизован - вывести его логин, иначе ссылку на авторизацию. Ее можно решить, смешивая PHP код и HTML код вместе.
Посмотрите примеры:
<?
$a=true;
if($a){//Данный HTML код будет виден на экране только если $a равно true
echo'<p>Здесь выведем какой-то HTML!';
}
?>
Однако, очень часто это может оказаться неудобным, особенно если размеры HTML кода очень большие. Поэтому можно воспользоваться следующим приемом с разрывом PHP:
<?//Пример на работу вместе с HTML
$a=true;
if($a){//Мы оборвали PHP, но HTML-код ниже все-равно будет виден на экране только если $a равно true.
?>
Здесь выведем какой-то HTML!
<?//Здесь мы продолжаем PHP, открыв скобку <? и закрываем фигурную скобку от ифа.
}
?>
Вложенные if
Предположим, нам необходимо спросить у PHP такую вещь: если переменная $a пуста, то вывести 'Введите $a', если не пуста, то проверить - > 0 $a или нет. Если > 0 - то вывести 'Больше 0!', если < - вывести 'Меньше 0'.
1 конструкцией if здесь не обойтись, нужно использовать 2 таким образом, чтобы 1 была внутри другой:
<?
if(empty($a)){//если переменная $a пуста
echo'Введите $a!';
}else{//если переменная $a не пуста
if($a>0){//спрашиваем, > ли 0 переменная $a
echo'Больше 0!';
}else{
echo'Меньше 0!';
}}
?>
Конструкция elseif
Недостатком конструкции предыдущего примера является большое количество фигурных скобок. Поэтому была изобретена специальная конструкция elseif (пишется слитно!), которая представляет собой одновременно и else, и начало вложенного if:
<?//Решение предыдущей задачи через конструкцию elseif
if(empty($a)){
echo'Введите $a!';
}elseif($a>0){//одновременно выполняется else для empty($a) и спрашивается > ли $a 0
echo'Больше 0!';
}else{
echo'Меньше 0!';
}
?>
Можно использовать несколько elseif, но злоупотреблять этим не стоит (лучше будет воспользоваться конструкцией switch-case, о которой ниже).
Несколько if
Пусть у нас есть такая задача: сайт поддерживает 3 языка - русский, английский, немецкий. Переменная $lang может принимать 3 значения - 'ru', 'en' и 'de'. В зависимости от значения переменной $lang следует вывести фразу на одном из языков.
Решение: можно было бы воспользоваться вложенными ифами или elseif. Выглядело бы это примерно так:
<?//Решение задачи через elseif - не самое удачное
if($a=='ru'){//фраза на русском
echo'Русский текст';
}elseif($a=='en'){//фраза на английском
echo'Английский текст';
}elseif($a=='de'){//фраза на немецком
echo'Немецкий текст';
}
?>
Такое решение не слишком красивое - блок else здесь не нужен! Проще всего будет написать не 1 длинный if с несколькими else, а несколько if вообще без else:
<?//Решение задачи через несколько if - оно намного лучше
if($a=='ru'){//фраза на русском
echo'Русский текст';
}
if($a=='en'){//фраза на английском
echo'Английский текст';
}
if($a=='de'){//фраза на немецком
echo'Немецкий текст';
}//В данном коде сработает только 1 из ифов, так как $a может иметь только 1 из значений
?>
Однако, это решение тоже не слишком удобно. Представьте, что у вас будет не 3 языка, а
10 - вам придется написать 10 конструкций if.
Для таких случаев существует конструкция switch-case.
Конструкция switch-case
Конструкция switch-case представляет собой альтернативу if-else, ее рекомендуется использовать в случае множественного выбора (например, 10 различных языков, как в нашей задаче).
Изучите ее синтаксис:
<?
switch($переменная){
case'значение1':
здесь код, который выполнится в случае, если переменная имеет значение1;
break;
case'значение2':
здесь код, который выполнится в случае, если переменная имеет значение2;
break;
case'значение3':
здесь код, который выполнится в случае, если переменная имеет значение3;
break;
default:
этот код выполнится в случае, если переменная не совпала ни с 1 значением;
break;
}
?>
Решим нашу задачу с 3 языками с помощью данной конструкции:
<?
switch($lang) {
case'ru':
echo'Русский текст';
break;
case'en':
echo'Английский текст';
break;
case'de':
echo'Немецкий текст';
break;
default:
echo'Данный язык не поддерживается';
break;
}
?>
Практика
Примеры решения задач
Задача
Если переменная $a=10, то выведите 'Верно', иначе выведите 'Неверно'.
Решение:
<? $a=10; if($a==10){ echo'Верно'; }else{ echo'Неверно'; } ?>
Задача
В переменной $min лежит число от 0 до 59. Определите в какую четверть часа попадает это число (в 1-ю, 2-ю, 3-ю или 4-ю).
Решение:
<? $min=10; if($min>=0 and$min<=14){ echo'В 1-ю четверть.'; } if($min<=15 and$min>=30){ echo'Во 2-ю четверть.'; } if($min<=31 and$min>=45){ echo'В 3-ю четверть.'; } if($min>=46 and$min<=59){ echo'В 4-ю четверть.'; } ?>
Задача
Переменная $l может принимать 2 значения: 'ru' и 'en'. Если она имеет значение 'ru', то в переменную $a запишем массив дней недели на русском языке, а если имеет значение 'en' - то на английском. Решите задачу через 2 if, через switch-case и через многомерный массив без ифов и switch.
Решение:
Решение через 2 if:
<? $l='ru'; if($l=='ru'){ $a=['пн','вт','ср','чт','пт','сб','вс']; } if($l=='en'){ $a=['mn','ts','wd','th','fr','st','sn']; } var_dump($a) ?>
Решение через switch-case:
<? $l='ru'; switch($l){ case 'ru': $a=['пн','вт','ср','чт','пт','сб','вс']; break; case 'en': $a=['mn','ts','wd','th','fr','st','sn']; break; } var_dump($a) ?>
Решение через многомерный массив:
<? $l='ru'; $a=[ 'ru'=>['пн','вт','ср','чт','пт','сб','вс'], 'en'=>['mn','ts','wd','th','fr','st','sn'], ]; var_dump($a[$l]) ?>
Задачи для решения
Работа с if-else
Если переменная $a=0, то выведите 'Верно', иначе выведите 'Неверно'. Проверьте работу скрипта при $a=1, 0, -3.
Если переменная $a>0, то выведите 'Верно', иначе выведите 'Неверно'. Проверьте работу скрипта при $a=1, 0, -3.
Если переменная $a<0, то выведите 'Верно', иначе выведите 'Неверно'. Проверьте работу скрипта при $a=1, 0, -3.
Если переменная $a> или =0, то выведите 'Верно', иначе выведите 'Неверно'. Проверьте работу скрипта при $a=1, 0, -3.
Если переменная $a< или =0, то выведите 'Верно', иначе выведите 'Неверно'. Проверьте работу скрипта при $a=1, 0, -3.
Если переменная $a не =0, то выведите 'Верно', иначе выведите 'Неверно'. Проверьте работу скрипта при $a=1, 0, -3.
Если переменная $a='test', то выведите 'Верно', иначе выведите 'Неверно'. Проверьте работу скрипта при $a='test', 'тест', 3.
Если переменная $a='1' и по значению и по типу, то выведите 'Верно', иначе выведите 'Неверно'. Проверьте работу скрипта при $a='1', 1, 3.
Работа с empty и isset
Если переменная $a пустая, то выведите 'Верно', иначе выведите 'Неверно'. Проверьте работу скрипта при $a=1, 3, -3, 0, null, true, '', '0'.
Если переменная $a не пустая, то выведите 'Верно', иначе выведите 'Неверно'.
Если переменная $a существует, то выведите 'Верно', иначе выведите 'Неверно'. Проверьте работу скрипта при $a=3 и null.
Если переменная $a не существует, то выведите 'Верно', иначе выведите 'Неверно'.
Работа с логическими переменными
Если переменная $var=true, то выведите 'Верно', иначе выведите 'Неверно'. Проверьте работу скрипта при $var=true, false. Напишите 2 варианта скрипта - с короткой записью и с длинной.
Если переменная $var не =true, то выведите 'Верно', иначе выведите 'Неверно'. Проверьте работу скрипта при $var=true, false. Напишите 2 варианта скрипта - с короткой записью и с длинной.
Работа с OR и AND
Если переменная $a>0 и <5, то выведите 'Верно', иначе выведите 'Неверно'. Проверьте работу скрипта при $a=5, 0, -3, 2.
Если переменная $a=0 или =2, то прибавьте к ней 7, иначе поделите ее на 10. Выведите новое значение переменной на экран. Проверьте работу скрипта при $a=5, 0, -3, 2.
Если переменная $a= или <1, а переменная $b> или =3, то выведите сумму этих переменных, иначе выведите их разность (результат вычитания). Проверьте работу скрипта при $a и $b=1 и 3, 0 и 6, 3 и 5.
Если переменная $a>2 и <11, или переменная $b> или =6 и <14, то выведите 'Верно', в противном случае выведите 'Неверно'.
На switch-case
Переменная $n может принимать 1 из значений: 1, 2, 3 или 4. Если она имеет значение '1', то в переменную $r запишем 'зима', если имеет значение '2' - 'лето' и так далее. Решите задачу через switch-case.
Задачи
В переменной $d лежит какое-то число из интервала от 1 до 31. Определите в какую декаду месяца попадает это число (в 1-ю, 2-ю или 3-ю).
В переменной $month лежит какое-то число из интервала от 1 до 12. Определите в какую пору года попадает этот месяц (зима, лето, весна, осень).
В переменной $y хранится год. Определите, является ли он високосным (в таком году есть 29 февраля). Год будет високосным в 2 случаях: либо он делится на 4, но при этом не делится на 100, либо делится на 400. Так, годы 1700, 1800 и 1900 не являются високосными, т.к. они делятся на 100 и не делятся на 400. Годы 1600 и 2000 - високосные, т.к. они делятся на 400.
Дана строка с символами, например, 'abcde'. Проверьте, что 1-м символом этой строки является буква 'a'. Если это так - выведите 'да', в противном случае выведите 'нет'.
Дана строка с цифрами, например, '12345'. Проверьте, что 1-м символом этой строки является цифра 1, 2 или 3. Если это так - выведите 'да', в противном случае выведите 'нет'.
Дана строка из 3-х цифр. Найдите сумму этих цифр. Т.е. сложите как числа 1-й символ строки, 2-й и 3-й.
Дана строка из 6 цифр. Проверьте, что сумма 1-х 3 цифр равняется сумме 2-х 3 цифр. Если это так - выведите 'да', в противном случае выведите 'нет'.