Подвыражение
Оригинальное название: 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 читается быстрее, чем три сравнения через &&. Заодно повторное вычисление тяжёлой функции происходит один раз. Лишние скобки там, где порядок и так очевиден, вредят меньше, чем их нехватка в неочевидном месте.

