Los operadores son los símbolos que calculan (+, *), comparan (===, >) y combinan condiciones (&&, ||). La mayoría son los mismos de C; las diferencias están en la comparación, y son las que más errores causan.

Aritméticos

<?php
$a = 17;
$b = 5;
 
echo $a + $b, "\n";
echo $a - $b, "\n";
echo $a * $b, "\n";
echo $a / $b, "\n";
echo $a % $b, "\n";
echo $b ** 2, "\n";
echo intdiv($a, $b), "\n";
22
12
85
3.4
2
25
3
OperadorOperaciónEjemploResultado
+ - *Suma, resta, multiplicación17 * 585
/División (puede dar decimal)17 / 53.4
%Resto de la división entera17 % 52
**Potencia5 ** 225
intdiv(a, b)División entera (sin decimales)intdiv(17, 5)3

Diferencia con C

En C, 17 / 5 entre enteros da 3. En PHP da 3.4: la división siempre da el resultado exacto. Si quieres la parte entera, usa intdiv().

Correcto: % para saber si un número es par

<?php
$numero = 14;
var_dump($numero % 2 === 0);
bool(true)

Si el resto de dividir por 2 es 0, es par. Se usa, por ejemplo, para pintar las filas de una tabla de forma alternada.

Asignación

EscribesEquivale aEjemplo con $x = 10
$x += 5$x = $x + 515
$x -= 3$x = $x - 37
$x *= 2$x = $x * 220
$x /= 4$x = $x / 42.5
$x .= "!"$x = $x . "!""10!"
$x++$x = $x + 111
$x--$x = $x - 19
<?php
$total = 0;
$total += 15990;
$total += 4500;
echo "Total: $total\n";
 
$visitas = 0;
$visitas++;
$visitas++;
echo "Visitas: $visitas\n";
Total: 20490
Visitas: 2

Comparación

Una comparación siempre da true o false.

OperadorPregunta5 ? 3
===¿Iguales en valor y tipo?false
!==¿Distintos en valor o tipo?true
< >¿Menor? ¿Mayor?false, true
<= >=¿Menor o igual? ¿Mayor o igual?false, true
==¿Iguales después de convertir los tipos?false
!=¿Distintos después de convertir los tipos?true

== frente a ===

== (comparación flexible) convierte los dos valores a un mismo tipo antes de comparar. === (comparación estricta) compara valor y tipo, sin convertir.

<?php
var_dump("5" == 5);
var_dump("5" === 5);
var_dump(null == false);
var_dump(null === false);
var_dump("1" == "01");
var_dump("1" === "01");
bool(true)
bool(false)
bool(true)
bool(false)
bool(true)
bool(false)

Incorrecto: comparar con ==

<?php
$codigo = "01";
 
if ($codigo == "1") {
    echo "Código 1\n";
}
Código 1

"01" y "1" son textos distintos, pero como los dos parecen números, == los convierte y los encuentra iguales. Con códigos, RUT o contraseñas, este comportamiento deja pasar cosas que no debería.

Correcto: compara siempre con ===

<?php
$codigo = "01";
 
if ($codigo === "1") {
    echo "Código 1\n";
} else {
    echo "Otro código\n";
}
Otro código

Regla del curso: === y !== siempre. Si necesitas comparar un texto con un número, conviértelo antes a propósito, con (int).

Incorrecto: un solo signo igual en una condición

<?php
$rol = "estudiante";
 
if ($rol = "admin") {
    echo "Bienvenido, administrador\n";
}
Bienvenido, administrador

= asigna: guarda "admin" en $rol y la condición queda verdadera. No da error y es muy difícil de ver. Igual que en C.

Lógicos

Combinan condiciones.

OperadorSe leeEs true cuando
&&yLas dos condiciones son verdaderas
||oAl menos una es verdadera
!noLa condición es falsa
<?php
$nota = 5.5;
$asistencia = 70;
 
$aprueba = $nota >= 4.0 && $asistencia >= 75;
$tieneAlgo = $nota >= 4.0 || $asistencia >= 75;
 
var_dump($aprueba);
var_dump($tieneAlgo);
var_dump(!$aprueba);
bool(false)
bool(true)
bool(true)

Tabla de verdad

   A       B    |  A && B   A || B   !A
 ---------------+------------------------
 true    true   |  true     true     false
 true    false  |  false    true     false
 false   true   |  false    true     true
 false   false  |  false    false    true

Incorrecto: and y or

PHP también acepta las palabras and y or, pero tienen menos prioridad que el =: $ok = true and false; guarda true. Usa siempre && y ||.

Orden de evaluación

Igual que en matemáticas, primero se evalúan las multiplicaciones y después las sumas. De mayor a menor prioridad:

  1. **
  2. !
  3. * / %
  4. + -
  5. .
  6. < <= > >=
  7. === !== == !=
  8. &&
  9. ||
  10. = += .= y demás asignaciones

Correcto: paréntesis cuando hay duda

<?php
$promedio = (6.0 + 5.0 + 4.0) / 3;
echo $promedio, "\n";
5

Sin paréntesis, 6.0 + 5.0 + 4.0 / 3 daría 12.33…: la división se haría antes. Los paréntesis no cuestan nada y dejan clara la intención.

Funciones matemáticas

<?php
$notas = 6.0 + 5.5 + 4.2;
$promedio = $notas / 3;
 
echo $promedio, "\n";
echo round($promedio, 1), "\n";
echo floor(5.9), " ", ceil(5.1), "\n";
echo max(4.2, 6.0, 5.5), " ", min(4.2, 6.0, 5.5), "\n";
echo abs(-7), "\n";
5.2333333333333
5.2
5 6
6 4.2
7

Referencia de funciones matemáticas

FunciónQué haceEjemploResultado
round($n, $d)Redondea a $d decimales (0 si no se indica)round(5.55, 1)5.6
floor($n)Redondea hacia abajofloor(5.9)5
ceil($n)Redondea hacia arribaceil(5.1)6
max(…) / min(…)El mayor / el menor de varios valoresmax(3, 9, 4)9
abs($n)Valor absolutoabs(-7)7
intdiv($a, $b)División enteraintdiv(17, 5)3
sqrt($n)Raíz cuadradasqrt(16)4
random_int($min, $max)Entero al azar entre los dos (incluidos)random_int(1, 6)Un dado

Redondear para mostrar, no para guardar

Igual que con number_format(), redondea en el momento de mostrar. Si redondeas cada nota antes de promediar, el promedio final puede cambiar.

Pruébalo

  • Calcula el promedio de tres notas tuyas y muéstralo con un decimal
  • Usa % para decir si el año actual es par o impar
  • Compara "5" == 5 y "5" === 5 y explica el resultado antes de ejecutar
  • Simula un dado con random_int(1, 6) y ejecútalo varias veces
  • Error provocado: escribe if ($rol = "admin") y comprueba que siempre entra

Errores comunes

SíntomaCausaSolución
La condición siempre es verdaderaUsaste = en vez de ===Compara con ===
Dos textos distintos salen igualesComparaste con == y PHP los convirtióUsa ===
El promedio sale malFaltan paréntesis: la división se hizo antes que la suma(a + b + c) / 3
DivisionByZeroError: Division by zeroDividiste por 0 (por ejemplo, promedio de cero notas)Revisa que el divisor no sea 0 antes de dividir

Checkpoint

Intenta responder antes de desplegar cada pregunta.