Expresiones en PHP: Operadores y precedencia

Como mencioné en un tutorial anterior, las expresiones son la parte más fundamental en un lenguaje de programación que tiene como fin devolver un valor. En este post hablaré de los operadores y precedencia que tienen.

En php hay una gran variedad de operadores con distintas finalidades.

Operador Descripción Ejemplo
Aritmético Para matemática básica $a – $b
Array Union de arrays $a + $b
Asignación Asignar valores $a = $b + 11
Bitwise Manipular bits dentro de bytes (binario) 12 > 5
Comparación Comparar 2 valores 2 < 5
Ejecucion Ejecuta comandos shell dentro de comillas invertidas ls -al
Incremento/decremento Añade o quita 1 $a++ o $b–
Lógico Booleanos $a and $b
String Concatenación $a . $b

Un operador puede tomar diferentes números de operandos:

  • Los operadores unarios, tanto el de incremento como decremento, pueden ser uno ($a+ o $b-) o 2 operandos ($a++ o $b–).
  • El operador ternario que toma forma de ? x : y. Es una condición de una sola línea que escoge entre 2 expresiones dependiendo del booleano resultante de la condición. Por ejemplo, (condición)? Valor-si-verdadero : valor-si-falso.

Precedencia

La precedencia se puede entender como una prioridad. Sucede como en las matemáticas, según el operador habrá que realizar esa operación antes que otra. De no tener precendecia los operadores serían procesados en el orden en el que se encuentran. Algunos tienen la misma precedencia.

Un ejemplo sería con los operadores de suma y resta. Al tener la asociatividad a la izquierda, se realizan las operaciones de izquierda a derecha.

1 + 2 + 3 – 4 + 5

2 – 4 + 5 + 3 + 1

Tanto uno como otro darán 7. Los operadores (+) y (-) tienen la misma precedencia.

1 * 2 * 3 / 4 * 5

2 / 4 * 5 * 3 * 1

Sucede lo mismo que en el caso anterior, dando 7,5 como resultado. Pero si se mezclasen operadores con diferentes precedencias

1 + 2 * 3 – 4 * 5

2 – 4 * 5 * 3 + 1

Habría que empezar con las multiplicaciones de izquierda a derecha. Los pondré entre paréntesis para que sea más ilustrativo.

1 + (2 * 3) – (4 * 5)

2 – (4 * 5 * 3) + 1

Esto resultaría en lo siguiente

1 + (6) – (20)

2 – (60) + 1

Los resultados finales serían -13 y -57.

Para forzar una precedencia basta con usar paréntesis. incluso aunque no haga falta es recomendable para que el código sea más legible.

((1 + 2) * 3 – 4) * 5

(2 – 4) * 5 * 3 + 1

En este caso serían 25 y -29 los resultados.

Tabla de operadores

En la siguiente tabla pondré los operadores en orden de precendencia (de mayor a menor) y su asociatividad. Recordad que la asociativdad indica el orden de las operaciones, de izquierda a derecha o viceversa.

Operador Tipo Asociatividad
() Paréntesis No
++ — Incremento / decremento Derecha
! Lógico Derecha
* / % Aritmético Izquierda
+ – . Aritmético y string Izquierda
<< >> Bitwise Izquierda
< <= > >= <> Comparación No
== != === !== Comparación No
& Bitwise (y referencia) Izquierda
^ Bitwise Izquierda
| Bitwise Izquierda
&& Lógico Izquierda
|| Lógico Izquierda
? : Ternario Izquierda
= += -= *= /= .= %= &= != ^= <<= >>= Asignación Derecha
and lógico Izquierda
xor lógico Izquierda
or lógico Izquierda

Y aquí finaliza el tutorial de hoy. Pasad un buen finde 🙂