📚
#37 23.09.2025 PHP Basics

Опишите принцип работы оператора and в PHP. В чём ключевое отличие and от &&?

and — это логический оператор “И” с низким приоритетом (ниже чем у присваивания =). Его ключевое отличие от && — в порядке выполнения операций. Из-за этого $result = true and false присваивает true, а не false. Рекомендуется использовать && в большинстве случаев, а при использовании and — явно указывать порядок скобками.

Подробнее
⚠️
Внимание! Этот текст был сгенерирован AI-ассистентом. Информация может содержать неточности и требует проверки.

Полный ответ:

1. Основное назначение

and — это логический оператор “И”. Он возвращает true, если оба операнда истинны.

$condition1 = true;
$condition2 = false;

$result = $condition1 and $condition2; // false

2. Синтаксические аналоги

У and есть два синтаксических аналога, которые делают то же самое:

Оператор Тип Пример
and Словесный $a and $b
&& Символьный $a && $b

3. Ключевое отличие: приоритет операторов

Самая важная особенность, которая является частым источником ошибок — разный приоритет выполнения.

  • && имеет ВЫСОКИЙ приоритет (как у умножения)
  • and имеет НИЗКИЙ приоритет (ниже чем у присваивания =)

Наглядный пример:

// Пример 1
$result = true && false;
var_dump($result); // bool(false)
// Эквивалентно: $result = (true && false);

// Пример 2 (КРИТИЧЕСКИ ВАЖНО!)
$result = true and false;
var_dump($result); // bool(true) !!!
// Эквивалентно: ($result = true) and false;

4. Практические последствия разного приоритета

Опасная ситуация с присваиванием:

// Намерение: проверить условие и присвоить результат
$user = findUser($id) and $user->isActive();
// Эквивалентно: ($user = findUser($id)) and $user->isActive();
// $user всегда будет присвоен, даже если isActive() вернет false!

// Правильно с &&:
$user = findUser($id) && $user->isActive();
// Другой подход:
$user = findUser($id);
$isActive = $user && $user->isActive();

Сложные условия:

// С and (низкий приоритет)
if ($a > 0 and $b > 0 or $c > 0) {
    // Эквивалентно: (($a > 0) and ($b > 0)) or ($c > 0)
}

// С && (высокий приоритет)  
if ($a > 0 && $b > 0 || $c > 0) {
    // Эквивалентно: ($a > 0) && (($b > 0) || ($c > 0))
}

5. Когда использовать and?

Несмотря на потенциальные опасности, у and есть свои резонные случаи использования:

Для улучшения читаемости в цепочках условий:

// Более читаемо, чем в одну строку
if ($user !== null 
    and $user->isActive() 
    and $user->hasPermission('edit')
) {
    // ...
}

Для выполнения действий только при успешном условии:

// Если connect() вернет true, тогда выполнится sendData()
$isConnected = connect() and sendData();
// Аналогично: if (connect()) { sendData(); }

6. Полная таблица приоритетов логических операторов

От высшего к низшему:

  1. ! (логическое НЕ)
  2. && (логическое И)
  3. || (логическое ИЛИ)
  4. and (логическое И)
  5. xor (исключающее ИЛИ)
  6. or (логическое ИЛИ)

7. Best Practices

  1. Для большинства случаев используйте && — он более предсказуем
  2. Если используете and, всегда применяйте скобки для явного указания порядка
  3. Избегайте смешивания && и and в одном выражении
  4. Для присваивания с условием используйте явный if
// Хорошо:
if ($condition1 && $condition2) { ... }

// Также допустимо (с явными скобками):
if (($condition1 and $condition2) or $condition3) { ... }

// Опасно (без скобок):
if ($condition1 and $condition2 or $condition3) { ... }

Итог:

and — это логический оператор “И” с низким приоритетом (ниже чем у присваивания =). Его ключевое отличие от && — в порядке выполнения операций. Из-за этого $result = true and false присваивает true, а не false. Рекомендуется использовать && в большинстве случаев, а при использовании and — явно указывать порядок скобками.