Errores comunes con estructuras de control
Estos son los errores más frecuentes al trabajar con condicionales, switch y bucles en PHP. Reconocerlos desde el principio ahorra mucho tiempo de depuración.
Errores con condicionales (if/else)
El error más frecuente: confundir asignación (=) con comparación (==).
<?php
if ($variable = 5) { // INCORRECTO: esto asigna 5 a $variable
// Este código siempre se ejecutará
}
// CORRECTO:
if ($variable == 5) { // Comparación de valor
// Se ejecuta solo si $variable es igual a 5
}
?>
No usar comparación estricta (===) cuando es necesario.
<?php
// PELIGROSO: "0", 0, false, null, y "" son iguales con ==
if ($valor == false) {
// Se ejecutará con cualquiera de esos valores
}
// SEGURO: Compara valor y tipo
if ($valor === false) {
// Solo se ejecuta si $valor es exactamente false
}
?>
Olvidar las llaves en bloques de múltiples líneas.
<?php
// INCORRECTO:
if ($condicion)
echo "Primera línea";
echo "Segunda línea"; // Esta línea siempre se ejecuta
// CORRECTO:
if ($condicion) {
echo "Primera línea";
echo "Segunda línea";
}
?>
Errores con switch
Olvidar el break en los case.
<?php
// INCORRECTO:
switch ($opcion) {
case 'a':
echo "Opción A";
// Sin break, continúa ejecutando el siguiente case
case 'b':
echo "Opción B"; // Se ejecuta si $opcion es 'a' o 'b'
break;
}
// CORRECTO:
switch ($opcion) {
case 'a':
echo "Opción A";
break;
case 'b':
echo "Opción B";
break;
}
?>
Comparaciones complejas dentro de switch.
<?php
// INCORRECTO: switch solo puede comparar valores directos
switch ($edad) {
case ($edad >= 18): // Esto no funciona como se espera
echo "Mayor de edad";
break;
}
// CORRECTO: Usar if/else para comparaciones complejas
if ($edad >= 18) {
echo "Mayor de edad";
}
?>
Errores con bucles
Bucles infinitos por olvidar el incremento.
<?php
// INCORRECTO: bucle infinito
$i = 1;
while ($i <= 10) {
echo $i;
// Olvidó incrementar $i
}
// CORRECTO:
$i = 1;
while ($i <= 10) {
echo $i;
$i++; // Incrementa la variable
}
?>
Inicialización incorrecta de bucles for.
<?php
// INCORRECTO: variable no declarada
for ($i < 10; $i++) { // $i no está inicializada
echo $i;
}
// CORRECTO:
for ($i = 0; $i < 10; $i++) {
echo $i;
}
?>
Modificar la variable de iteración dentro de foreach sin referencia.
<?php
// INCORRECTO: modificar la variable de iteración
foreach ($array as $item) {
$item = $item * 2; // No modifica el array original
}
// CORRECTO: usar referencia si se quiere modificar
foreach ($array as &$item) {
$item = $item * 2;
}
unset($item); // Importante: libera la referencia
?>
Errores de lógica
Condiciones anidadas excesivas.
<?php
// DIFÍCIL DE MANTENER:
if ($condicion1) {
if ($condicion2) {
if ($condicion3) {
// Código muy anidado
}
}
}
// MEJOR:
if (!$condicion1 || !$condicion2 || !$condicion3) {
return; // Salir temprano
}
// Código principal aquí
?>
No validar entradas de formularios.
<?php
// PELIGROSO: confiar en datos de entrada sin validar
$edad = $_POST['edad']; // Podría ser cualquier cosa
if ($edad >= 18) {
// Acceso permitido
}
// SEGURO:
$edad = filter_input(INPUT_POST, 'edad', FILTER_VALIDATE_INT);
if ($edad !== false && $edad >= 18) {
// Acceso permitido
}
?>
Comparar flotantes directamente.
<?php
// INCORRECTO: comparación imprecisa de flotantes
if ($precio === 10.00) { // Puede fallar por imprecisión de decimales
}
// CORRECTO: usar un margen de error (épsilon)
if (abs($precio - 10.00) < 0.0001) {
}
?>
Recapitulación
- Usa
==para comparar valor,===para comparar valor y tipo. Nunca uses=dentro de unif. - Pon siempre llaves
{}en los bloques, aunque sean de una sola línea. - En
switch, no olvides elbreak; usaif/elsepara comparaciones complejas. - Todo bucle necesita un mecanismo de salida: sin incremento, hay bucle infinito.
- Para modificar el array original en un
foreach, usa la referencia&$itemy libérala conunset()al terminar. - Evita el anidamiento profundo: "salida temprana" con
returnocontinuehace el código más legible. - Valida siempre los datos de formularios con
filter_input()antes de usarlos en condiciones. - Para comparar flotantes, usa un margen de error (épsilon) en lugar de comparación directa.
En la próxima lección: funciones de usuario en PHP: cómo definirlas, pasarles argumentos y devolver valores.