Урок 4. Работа с конструкциями 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;
}
?>