2.6. Построение выражений
При вычислении значения выражения, состоящего из нескольких операторов, синтаксический анализатор PHP оценивает операторы в соответствии с их приоритетом (табл. 2.13). Операторы с более высоким приоритетом вычисляются первыми. Рассмотрим вычисление выражения 2 + 2 * 2. Так как приоритет оператора умножения * более высокий, чем оператора +, сначала вычисляется оператор 2 * 2. После чего PHP складывает 2 и 4 и возвращает результат - 6.
Однако одной приоритетности недостаточно. Рассмотрим выражение 12 / 2 * 3. Оба оператора, присутствующие в этом выражении, деление и умножение, имеют одинаковый приоритет. Однако результат этого выражения будет различаться в зависимости от того, какой из операторов будет выполнен первым, т.е. (12 / 2) * 3 не равно
12 / (2 * 3) .
Поскольку мы ожидаем от PHP следования элементарным правилам арифметики, которые мы знаем еще с начальной школы, очень важно, чтобы неоднозначность, возникающая при выполнении таких операций, разрешалась правильно. Мы ожидаем, что в результате вычисления этого выражения будет получено число 18, так как мы научены выполнять операторы, имеющие равные приоритеты, слева направо. В вычислительной науке это правило называется ассоциативность. Операторы могут быть ассоциативны слева, ассоциативны справа и неассоциативны совсем.
Обычная операция умножения ассоциативна слева. Анализатор PHP оценивает выражение слева направо. Операции присвоения ассоциативны справа. Анализатор PHP вычисляет значение, расположенное в правой части, а потом присваивает его переменной, расположенной в левой части. Выражение, использующее неассоциативный оператор, не может использоваться в качестве операнда другого выражения, использующего неассоциативный оператор. Создание такого выражения приведет к синтаксической ошибке, если для изолирования неассоциативного выражения не воспользоваться скобками.
Так как приоритет и ассоциативность всех операторов PHP запомнить сразу довольно трудно, можно при построении выражений воспользоваться следующими двумя правилами: сложение и вычитание выполнять до умножения и деления либо использовать обыкновенные скобки. Это может показаться забавным, но выполнение таких правил поможет сэкономить вам многие часы отладки.
В табл. 2.13 приводятся данные о приоритетности и ассоциативности операторов PHP.
Переменные, операторы и выражения
Переменные, операторы и выражения
Переменные, операторы и выражения