Конструкция if-else

Для того, чтобы напрограммировать что-нибудь полезное, одних переменных далеко не достаточно. Нам нужен механизм, который позволит выполнять определенный код в зависимости от каких-либо условий.

То есть нам нужно иметь возможность спросить у PHP 'Если'.

Например так: если эта переменная меньше нуля, то вывести 'отрицательно', иначе (то есть если она больше нуля) вывести 'положительно'.

В PHP для таких вопросов предназначена конструкция if, которая позволяет выполнять определенный код при выполнении какого-либо условия:

<?php
	if (логическое выражение) {
		Этот код выполниться,
		если логическое выражение верно (то есть равно true)
	}
 	else 
 	{
		Этот код выполнится,
		если логическое выражение неверно (то есть равно false)
	}
?>

Обратите внимание на то, что блок else не обязателен.

Логическое выражение представляет собой тот самый вопрос, который мы хотим задать PHP. Например, чтобы спросить 'переменная $a больше нуля' мы напишем так: $a > 0.

Примеры работы:

<?php
	$a = 3;

	/*
		Если переменная $a больше нуля, то выведи 'верно',
		иначе (если меньше или равна нулю) выведи 'неверно'
	*/
	if ($a > 0) {echo 'Верно!';} else {echo 'Неверно!';} //выведет 'Верно!'
?>
<?php
	$a = -3;

	/*
		Если переменная $a больше или равна нулю, то выведи 'верно',
		иначе (если меньше нуля) выведи 'неверно'
	*/
	if ($a >= 0) {echo 'Верно!';} else {echo 'Неверно!';} //выведет 'Неверно!'
?>

Сокращенный синтаксис

В случае, если в фигурный скобках if или else будет только одно выражение, можно эти фигурные скобки не писать:

<?php
	//Полный вариант:
	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 'Неверно!'; 
?>

Равенство по значению и типу

Для того, чтобы сравнить на равенство следует использовать оператор двойное равно ==, а не одиночное =, как можно было подумать.

Почему так? Потому что одиночное равно зарезервировано за присваиванием. Смотрите пример:

<?php
	$a = 0;

	/*
		Если переменная $a равна нулю, то выведи 'верно',
		иначе (если не равна нулю) выведи 'неверно'
	*/
	if ($a == 0) echo 'Верно!'; else echo 'Неверно!'; //выведет 'Верно!'
?>

А следующий пример работать будет не так, как мы думаем:

<?php
	$a = 0;

	/*
		Мы думаем оно работает так:
			если переменная $a равна нулю, то выведи 'верно',
 			иначе (если не равна нулю) выведи 'неверно'.

		На самом деле оно работает так:
			переменной $a присвоить 1,
			если удалось присвоить - то выведи 'верно',
			иначе (если не удалось присвоить) выведи 'неверно'.
	*/

	if ($a = 1) echo 'Верно!'; else echo 'Неверно!'; //всегда будет выводить 'Верно!'
?>

Кроме оператора == существует еще и оператор ===. Их различие в том, что === сравнивает не только по значению, но и по типу, а == сравнивает только по значению.

Чтобы полностью разобраться в этом, внимательно изучите примеры:

<?php
	$a = '0'; //переменная $a представляет собой строку, а не число 0
	if ($a == 0) echo 'Верно!'; else echo 'Неверно!';

	/*
		Выведет 'Верно!', так как проверяется только значение, но не тип.
		Поэтому '0' равен 0.
	*/
?>
<?php
	$a = '0'; //переменная $a представляет собой строку, а не число 0
	if ($a === 0) echo 'Верно!'; else echo 'Неверно!';

	/*
		Выведет 'Неверно!', так как строка '0'
 		не равна числу 0 при сравнении по типу.
	*/
?>

Не равно

Для того, чтобы спросить 'не равно', существует операторы != и !==. Первый игнорирует различие в типах, а второй - нет.

<?php
	$a = 0;

	/*
		Если переменная $a НЕ равна нулю, то выведи 'верно',
		иначе (если не равна нулю) выведи 'неверно'
	*/
	if ($a != 0) echo 'Верно!'; else echo 'Неверно!'; //выведет 'Верно!', так как $a равно 0
?>
<?php
	$a = 1;

	/*
		Если переменная $a НЕ равна нулю, то выведи 'верно',
		иначе (если не равна нулю) выведи 'неверно'
	*/
	if ($a != 0) echo 'Верно!'; else echo 'Неверно!'; //выведет 'Неверно!', так как $a равно 0
?>
<?php
	$a = '0';

	/*
		Если переменная $a НЕ равна нулю, то выведи 'верно',
		иначе (если не равна нулю) выведи 'неверно'
	*/
	if ($a != 0) echo 'Верно!'; else echo 'Неверно!';

	/*
		Выведет 'Неверно!', так как $a равно '0',
		а различие в типах игнорируется.
	*/
?>
<?php
	$a = '0';

	/*
		Если переменная $a НЕ равна нулю, то выведи 'верно',
		иначе (если не равна нулю) выведи 'неверно'
	*/
	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

Зачастую в веб-программировании возникает следующая проблема: необходимо проверить переменную на пустоту.

Переменная будет пустая, если она равна нулю, '' (пустой строке), false или null (то есть не определена ранее).

Проверка на пустоту выполняется с помощью функции empty():

<?php
	$a = null;
	//Если $a пустое, то...
	if (empty($a)) echo 'Верно!'; else echo 'Неверно!'; //выведет 'Верно!'
?>
<?php
	$a = 0;
	//Если $a пустое, то...
	if (empty($a)) echo 'Верно!'; else echo 'Неверно!'; //выведет 'Верно!'
?>
<?php
	$a = '';
	//Если $a пустое, то...
	if (empty($a)) echo 'Верно!'; else echo 'Неверно!'; //выведет 'Верно!'
?>
<?php
	$a = 'hi';
	//Если $a пустое, то...
	if (empty($a)) echo 'Верно!'; else echo 'Неверно!'; //выведет 'Неверно!', так как $a не пустая
?>

Чаще возникает обратная задача - проверка на то, что переменная является НЕ пустой. Отрицание НЕ можно сделать с помощью оператора '!':

<?php
	$a = null;
	//Если $a Непустое, то...
	if (!empty($a)) echo 'Верно!'; else echo 'Неверно!'; //выведет 'Неверно!', так как $a пустое
?>

Функция isset

Аналогом empty является функция isset. Она проверяет существует ли переменная (то есть то, что она не равна null). Смотрите примеры:

<?php
	$a = 'hello';

	//Если $a существует, то...
	if (isset($a)) echo 'Верно!'; else echo 'Неверно!';

	/*
		Выведет 'Верно!', так как $a существует.
	*/
?>
<?php
	$a = 0;

	//Если $a существует, то...
	if (isset($a)) echo 'Верно!'; else echo 'Неверно!';

	/*
		Выведет 'Верно!', так как $a существует.
	*/
?>
<?php
	/*
		Пусть переменную $a вообще не определяли выше в коде
		(это все равно, что присвоить ей null).

		Если $a существует, то...
	*/
	if (isset($a)) echo 'Верно!'; else echo 'Неверно!'; //выведет 'Неверно!'
?>

Аналогично проверятся на НЕ существование (через !isset):

<?php
	$a = 3;

	//Если $a НЕ существует то...
	if (!isset($a)) echo 'Верно!'; else echo 'Неверно!';

	/*
		Выведет 'Неверно!', так как $a существует.
	*/
?>

Несколько условий сразу: or и and

Иногда может быть нужно составить какое-то сложное условие, например, пользователь вводит месяц своего рождения и вам нужно проверить, что введенное число больше или равно 1 и меньше либо равно 12 (так как в году 12 месяцев).

Для этого существуют операторы and (логическое И) и or (логическое ИЛИ).

<?php
	$a = 3;
	$b = -3;
	//Если $a больше нуля и $b одновременно меньше нуля то...
	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 больше нуля ИЛИ $b меньше нуля - хотя бы один из них, то...
		выведет 'Верно!', так как хотя $a и не больше нуля,
		но одно из условий -  $b < 0 - выполнится!
	*/
	if ($a > 0 or $b < 0) echo 'Верно!'; else echo 'Неверно!';
?>

Вместо and можно писать &&, а вместо or - ||.

Работа с логическими переменными

Многие функции PHP в результате своей работы возвращают либо true (истина), либо false (ложь). Эти значения довольно удобны при своей работе, но новичкам бывает довольно сложно понять их.

Представим себе, что переменная $a равна true. В таком случае конструкцию if можно записать так:

<?php
	$a = true;

	//Если $a равно true, то...
	if ($a == true) echo 'Верно!'; else echo 'Неверно!';

	/*
		Выведет 'Верно!', так как $a равно true.
	*/
?>

Так как такие сравнения довольно распространены в PHP, то существует специальный прием, облегчающий работу (но не понимание, к сожалению).

Прием такой: конструкцию $a == true можно заменить на более простую: вместо if ($a == true) написать if ($a) и она будет работать аналогично.

Следует пользоваться второй конструкцией, так как она проще.

<?php
	/*
		Заменим  $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
?>

Также обратите внимание на следующие примеры:

<?php
	//Данное выражение всегда будет выводить 'Верно'
	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 код вместе.

Посмотрите примеры:

<?php
	$a = true;
	if ($a) {
		//Данный HTML код будет виден на экране только если $a равно true
		echo '<p>Здесь выведем какой-то HTML!</p>';
	}
?>

Однако, очень часто это может оказаться неудобным, особенно если размеры HTML кода очень большие. Поэтому можно воспользоваться следующим приемом с разрывом PHP:

<?php
	//Пример на работу вместе с HTML
	$a = true;
	if ($a) {
		/*
			Мы оборвали PHP, но HTML код ниже
			все равно будет виден на экране только если $a равно true.
		*/
	?>
		<p>Здесь выведем какой-то HTML!</p>
	<?php
		/*
			Здесь мы продожаем PHP, открыв скобку <?php
			и закрываем фигурную скобку от ифа.
		*/
	}
?>

Вложенные if

Предположим, нам необходимо спросить у PHP такую вещь: если переменная $a пуста, то вывести 'Введите $a', если не пуста, то проверить - больше нуля $a или нет. Если больше нуля - то вывести 'Больше нуля!', если меньше - вывести 'Меньше нуля'.

Одной конструкцией if здесь не обойтись, нужно использовать две таким образом, чтобы одна была внутри другой:

<?php
	if (empty($a)) { //если переменная $a пуста
		echo 'Введите $a!';
	} else { //если переменная $a НЕ пуста
		if ($a > 0) { //спрашиваем, больше ли нуля переменная $a
			echo 'Больше нуля!'; 
		} else {
			echo 'Меньше нуля!'; 
		}
	}
?>

Конструкция elseif

Недостатком конструкции предыдущего примера является большое количество фигурных скобок. Поэтому была изобретена специальная конструкция elseif (пишется слитно!), которая представляет собой одновременно и else, и начало вложенного if:

<?php
	//Решение предыдущей задачи через конструкцию elseif
	if (empty($a)) {
		echo 'Введите $a!';
	} elseif ($a > 0) { //одновременно выполняется else для empty($a) и спрашивается больше ли $a нуля
		echo 'Больше нуля!';
 	} else {
		echo 'Меньше нуля!';
	}
?>

Можно использовать несколько elseif, но злоупотреблять этим не стоит (лучше будет воспользоваться конструкцией switch-case, о которой ниже).

Несколько if

Пусть у нас есть такая задача: сайт поддерживает 3 языка - русский, английский, немецкий. Переменная $lang может принимать 3 значения - 'ru', 'en' и 'de'. В зависимости от значения переменной $lang следует вывести фразу на одном из языков.

Решение: можно было бы воспользоваться вложенными ифами или elseif. Выглядело бы это примерно так:

<?php
	//Решение задачи через elseif – не самое удачное
	if ($a == 'ru') { //фраза на русском
		echo 'Русский текст';
	} elseif ($a == 'en') { //фраза на английском
		echo 'Английский текст';
	} elseif ($a == 'de') { //фраза на немецком
		echo 'Немецкий текст';
	}
?>

Такое решение не слишком красивое - блок else здесь не нужен! Проще всего будет написать не один длинный if с несколькими else, а несколько if вообще без else:

<?php
	//Решение задачи через несколько if – оно намного лучше
	if ($a == 'ru') { //фраза на русском
		echo 'Русский текст';
	} 
	if ($a == 'en') { //фраза на английском
		echo 'Английский текст';
	}
	if ($a == 'de') { //фраза на немецком
		echo 'Немецкий текст';
	}

	/*
		В данном коде сработает только один из ифов,
 		так как $a может иметь только одно из значений
	*/
?>

Однако, это решение тоже не слишком удобно. Представьте, что у вас будет не три языка, а 10 - вам придется написать 10 конструкций if.

Для таких случаев существует конструкция switch-case.

Конструкция switch-case

Конструкция switch-case представляет собой альтернативу if-else, ее рекомендуется использовать в случае множественного выбора (например, 10 различных языков, как в нашей задаче).

Изучите ее синтаксис:

<?php
	switch ($переменная) {
		case 'значение1':
 			здесь код, который выполнится в случае, если переменная имеет значение1;
		break;
		case 'значение2':
			здесь код, который выполнится в случае, если переменная имеет значение2;
		break;
		case 'значение3':
			здесь код, который выполнится в случае, если переменная имеет значение3;
		break;
		default:
			этот код выполнится в случае, если переменная не совпала ни с одним значением;
		break;
	}
?>

Решим нашу задачу с тремя языками с помощью данной конструкции:

<?php
	switch ($lang) {
		case 'ru':
			echo 'Русский текст';
 		break;
		case 'en': 
			echo 'Английский текст';
		break;
		case 'de': 
			echo 'Немецкий текст';
		break;
		default:
			echo 'Данный язык не поддерживается'; 
		break;
	}
?>