Tema
Operadores
Los operadores son los símbolos que hacen cosas con tus datos: sumar, comparar, unir textos, decidir. En esta lección conocerás todos los que usarás a diario, incluidos los modernos como ??, ?-> y <=>, y la trampa más famosa de PHP: == contra ===.
Concepto
Piensa en los operadores como los botones de una calculadora con superpoderes: además de sumar y restar, pueden comparar, combinar condiciones y elegir valores por defecto.
Aritméticos
php
<?php
$a = 17;
$b = 5;
echo $a + $b; // 22 suma
echo $a - $b; // 12 resta
echo $a * $b; // 85 multiplicación
echo $a / $b; // 3.4 división (siempre puede dar float)
echo $a % $b; // 2 módulo: el residuo de 17 / 5
echo $a ** 2; // 289 potencia
echo intdiv($a, $b); // 3 división entera
// El módulo es útil para saber si un número es par
$numero = 8;
echo $numero % 2 === 0 ? 'par' : 'impar'; // parAsignación
php
<?php
$total = 100;
$total += 50; // $total = $total + 50 → 150
$total -= 20; // → 130
$total *= 2; // → 260
$total /= 4; // → 65
$total %= 7; // → 2
$texto = 'Hola';
$texto .= ' mundo'; // Concatenar y asignar → 'Hola mundo'
$contador = 0;
$contador++; // Incremento: 1
$contador--; // Decremento: 0
// Pre vs post incremento
$x = 5;
echo $x++; // Imprime 5, luego $x vale 6
echo ++$x; // Primero suma (7), luego imprime 7Concatenación
El punto . une strings. En PHP no se usa + para unir texto.
php
<?php
$nombre = 'Ana';
$apellido = 'López';
$completo = $nombre . ' ' . $apellido; // 'Ana López'
echo 'Total: ' . (10 + 5); // 'Total: 15' (paréntesis por claridad)Comparación: == frente a ===
Esta es la parte más importante de la lección.
==(igualdad flexible): convierte tipos antes de comparar.===(igualdad estricta): compara valor y tipo.
php
<?php
var_dump(5 == '5'); // true → convierte '5' a 5
var_dump(5 === '5'); // false → int vs string
var_dump(0 == ''); // false en PHP 8 (true en PHP 7, ¡cuidado con código viejo!)
var_dump(null == false); // true
var_dump(null === false);// false
var_dump('abc' == 0); // false en PHP 8
var_dump('1' == '01'); // true → ambos numéricos
var_dump('1' === '01'); // false
// Desigualdad
var_dump(5 != '5'); // false
var_dump(5 !== '5'); // true
// Mayor, menor
var_dump(10 > 3); // true
var_dump(10 <= 10); // trueBuena práctica
Usa siempre === y !== salvo que tengas una razón concreta. Evitas sorpresas y tu código se lee con intención clara.
La nave espacial <=>
Devuelve -1, 0 o 1 según si el lado izquierdo es menor, igual o mayor. Perfecto para ordenar.
php
<?php
echo 1 <=> 2; // -1
echo 2 <=> 2; // 0
echo 3 <=> 2; // 1
$precios = [300, 50, 120];
usort($precios, fn($a, $b) => $a <=> $b); // Ascendente
print_r($precios); // [50, 120, 300]
usort($precios, fn($a, $b) => $b <=> $a); // DescendenteLógicos
php
<?php
$edad = 20;
$tieneIne = true;
// && (Y): ambas deben ser verdaderas
var_dump($edad >= 18 && $tieneIne); // true
// || (O): al menos una verdadera
$esVip = false;
$tieneCupon = true;
var_dump($esVip || $tieneCupon); // true
// ! (NO): invierte
var_dump(!$tieneIne); // false
// xor: exactamente una verdadera (poco usado)
var_dump(true xor true); // falseEvaluación en cortocircuito: con &&, si la primera condición es falsa, la segunda ni se evalúa. Con ||, si la primera es verdadera, tampoco. Úsalo a tu favor:
php
<?php
$usuario = null;
// Si $usuario es null, no intenta leer $usuario['rol'] (evita un warning)
if ($usuario !== null && $usuario['rol'] === 'admin') {
echo 'Bienvenido, admin';
}Error común
PHP también tiene and y or en palabras, pero tienen menor precedencia que =. $ok = true and false; deja $ok en true. Usa siempre && y ||.
Ternario y Elvis
php
<?php
$stock = 0;
// condición ? si_verdadero : si_falso
$mensaje = $stock > 0 ? 'Disponible' : 'Agotado';
echo $mensaje; // Agotado
// "Elvis" ?: devuelve el lado izquierdo si es "verdadero"; si no, el derecho
$nombre = '';
echo $nombre ?: 'Invitado'; // Invitado (porque '' es falso)Fusión de null ?? y ??=
?? devuelve el lado izquierdo si existe y no es null; si no, el derecho. No lanza avisos si la variable o la clave no existen. Lo usarás muchísimo con formularios.
php
<?php
// Si no viene ?pagina= en la URL, usa 1
$pagina = $_GET['pagina'] ?? 1;
$config = ['tema' => 'oscuro'];
echo $config['idioma'] ?? 'es'; // es (la clave no existe, sin warning)
// Diferencia con ?:
$cantidad = 0;
echo $cantidad ?? 10; // 0 → 0 no es null
echo $cantidad ?: 10; // 10 → 0 es "falso"
// ??= asigna sólo si es null o no existe
$opciones = [];
$opciones['limite'] ??= 20;
echo $opciones['limite']; // 20Nullsafe ?->
Para objetos que podrían ser null. Si el lado izquierdo es null, toda la expresión devuelve null en vez de lanzar un error.
php
<?php
class Direccion { public string $ciudad = 'Monterrey'; }
class Cliente { public ?Direccion $direccion = null; }
$cliente = new Cliente();
// Sin nullsafe: Error, intentas leer ->ciudad de null
// echo $cliente->direccion->ciudad;
echo $cliente->direccion?->ciudad ?? 'Sin dirección'; // Sin direcciónPrecedencia
Como en matemáticas, * y / se evalúan antes que + y -. Cuando dudes, usa paréntesis: no cuesta nada y aclara la intención.
php
<?php
echo 2 + 3 * 4; // 14
echo (2 + 3) * 4; // 20
$total = 100;
$conIva = $total + $total * 0.16; // 116 (funciona, pero...)
$conIva = $total * (1 + 0.16); // ...esto es más claroEjemplo: calculadora de carrito
php
<?php
declare(strict_types=1);
$precioUnitario = 249.50;
$cantidad = (int) ($_GET['cantidad'] ?? 1); // ?cantidad=3 en la URL
$cupon = $_GET['cupon'] ?? '';
$esClienteFrecuente = true;
$subtotal = $precioUnitario * $cantidad;
// 10 % si el cupón es correcto O es cliente frecuente
$aplicaDescuento = $cupon === 'BIENVENIDO' || $esClienteFrecuente;
$descuento = $aplicaDescuento ? $subtotal * 0.10 : 0;
// Envío gratis a partir de $1000
$envio = ($subtotal - $descuento) >= 1000 ? 0 : 99;
$total = $subtotal - $descuento + $envio;
echo "Subtotal: $" . number_format($subtotal, 2) . "<br>";
echo "Descuento: -$" . number_format($descuento, 2) . "<br>";
echo "Envío: " . ($envio === 0 ? 'Gratis' : "$$envio") . "<br>";
echo "<strong>Total: $" . number_format($total, 2) . "</strong>";Pruébalo con http://localhost/carrito.php?cantidad=5&cupon=BIENVENIDO.
Ejercicios
- Dado
$segundos = 3725, calcula horas, minutos y segundos usandointdivy%. Muestra1 h 2 min 5 s. - Escribe una expresión que devuelva
'Aprobado'si$calificaciones mayor o igual a 7 y$asistenciaes mayor o igual a 80; si no,'Reprobado'. - Lee
$_GET['color']; si no viene, usa'azul'. MuestraTu color es: ....
Ver solución
php
<?php
$segundos = 3725;
$horas = intdiv($segundos, 3600); // 1
$minutos = intdiv($segundos % 3600, 60); // 2
$resto = $segundos % 60; // 5
echo "$horas h $minutos min $resto s";php
<?php
$calificacion = 8.5;
$asistencia = 75;
$resultado = ($calificacion >= 7 && $asistencia >= 80) ? 'Aprobado' : 'Reprobado';
echo $resultado; // Reprobado (asistencia insuficiente)php
<?php
$color = $_GET['color'] ?? 'azul';
// htmlspecialchars evita que alguien inyecte HTML/JS por la URL (lo verás en Seguridad)
echo 'Tu color es: ' . htmlspecialchars($color);Resumen
- Aritméticos:
+ - * / % **; la concatenación de texto es con.. - Usa siempre
===y!==para comparar. <=>compara y devuelve -1, 0 o 1: ideal para ordenar.&&,||,!con cortocircuito; evitaand/or.??da un valor por defecto sin avisos si algo no existe;??=asigna si es null.?->evita errores al acceder a propiedades de objetos que pueden ser null.- En caso de duda, paréntesis.