Подвыражение

Оригинальное название: subexpression

Коротко

Фрагмент большего выражения, который вычисляется отдельно и даёт промежуточный результат. В регулярных выражениях так называют часть шаблона в круглых скобках.

Что такое «Подвыражение»

Любое составное выражение разбирается на части. В записи $price * $qty + $delivery сначала вычисляется подвыражение $price * $qty, потом к нему прибавляется доставка. Порядок задают приоритет операторов и скобки: всё, что взято в скобки, становится отдельным подвыражением и считается раньше. Понимать эту структуру нужно, чтобы читать чужой код без сюрпризов и не допускать ошибок, которые не видны глазом.

Где порядок вычисления подводит

Классическая ловушка PHP — операторы and и or. Их приоритет ниже, чем у присваивания, поэтому подвыражения группируются не так, как ожидается:

$ok = true and false;    // ($ok = true) and false — в $ok попадёт true
$ok = true && false;     // $ok = (true && false) — false

$total = $a + $b * 2;    // умножение раньше сложения
$total = ( $a + $b ) * 2;

Ещё одна особенность — сокращённое вычисление. В условии $user && $user->isAdmin() правое подвыражение не выполняется вовсе, если $user пуст. На этом строятся проверки «если объект есть, то…», и это же объясняет, почему функция с побочным эффектом в правой части условия иногда «не срабатывает».

Подвыражения в регулярных выражениях

В регулярных выражениях подвыражением, или группой, называют часть шаблона в круглых скобках. Группа решает две задачи: позволяет применить квантификатор к нескольким символам сразу и запоминает совпавший текст, чтобы достать его отдельно:

preg_match( '/(\d{2})\.(\d{2})\.(\d{4})/', 'Доставка 15.03.2026', $m );
// $m[1] = '15', $m[2] = '03', $m[3] = '2026'

Если запоминать не нужно, используют незахватывающую группу (?:...), а для читаемости — именованную: (?<year>\d{4}).

Когда выносить подвыражение в переменную

Если одна и та же часть повторяется в нескольких местах условия или формула не помещается в строку, подвыражение стоит вынести в переменную с говорящим именем: $hasDiscount читается быстрее, чем три сравнения через &&. Заодно повторное вычисление тяжёлой функции происходит один раз. Лишние скобки там, где порядок и так очевиден, вредят меньше, чем их нехватка в неочевидном месте.

Обновлено:

Все термины раздела «Backend»

Что будем искать? Например,Продвижение