Apuntes php

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

Errores comunes con estructuras de control

Estos son algunos de los errores más frecuentes que cometemos los principiantes al trabajar con estructuras de control en PHP:

Errores con condicionales (if/else)

El error mas frecuente: confundir el operador de asignación con el de 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
                }
?>

Mi especialidad: 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 en 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

<?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 un foreach

<?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) {
?>    
TOP