Apuntes sobre Php

PHP: Porque a veces necesitas un poco de caos en tu vida.

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 un if.
  • Pon siempre llaves {} en los bloques, aunque sean de una sola línea.
  • En switch, no olvides el break; usa if/else para 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 &$item y libérala con unset() al terminar.
  • Evita el anidamiento profundo: "salida temprana" con return o continue hace 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.

TOP