Damián De Luca - Capacitación & Desarrollo Web

Buenas prácticas en PHP

PHP
Buenas prácticas en PHP

Como docente y desarrollador, sé que escribir código limpio y eficiente es fundamental para cualquier programador. PHP, siendo uno de los lenguajes más populares para el desarrollo web, ofrece una amplia gama de funcionalidades, y con la llegada de PHP 8, surgen nuevas características que deben aprovecharse de manera óptima.

En este artículo voy a destacar las características principales que debemos tener en cuenta al ahora de escribir código limpio y llevar adelante buenas prácticas en PHP.

Código legible

El código debe ser fácil de leer y comprender, no solo para nosotros, sino también para otros programadores que puedan trabajar en el proyecto. Si el código es confuso o difícil de seguir, será más propenso a errores y más difícil de mantener.

A continuación veremos un listado de 3 claves para mejorar la legibilidad de nuestro código:

Veamos un ejemplo de código que siga estas recomendaciones:

// Código menos legible
$x = get_p(); 
$r = $x * 0.2; 

// Código legible
$precioProducto = obtenerPrecioProducto();
$impuesto = $precioProducto * 0.2;

Tipado estricto (Strict Typing)

En PHP 7 y PHP 8, se introdujo el tipado, lo que permite especificar el tipo de dato que espera una función o método. Esto te ayuda a evitar errores de tipo de datos y hace que el código sea más robusto y fácil de mantener.

Ventajas del tipado estricto:

Implementación:

Es posible activar el modo de tipado estricto al inicio de tus archivos PHP:

declare(strict_types=1);

function calcularTotal(float $precio, int $cantidad): float {
    return $precio * $cantidad;
}

Novedad en PHP 8: Union Types

En PHP 8, podemos definir varios tipos de datos para una variable usando los union types. Esto es útil cuando una función puede aceptar o devolver diferentes tipos de datos.

function obtenerDato(int|string $dato) {
    return $dato;
}

Evitar repeticiones de código

Es importante evitar repetir código en diferentes lugares. Si encontramos que estamos escribiendo el mismo bloque de código más de una vez, es una señal de que debemos abstraerlo en una función o clase reutilizable.

¿Un ejemplo de esto? Analicemos el caso de una validación. En lugar de escribir la misma lógica de validación en múltiples archivos, podemos crear una clase de validación centralizada:

class Validador {
    public static function esCorreoValido(string $correo): bool {
        return filter_var($correo, FILTER_VALIDATE_EMAIL) !== false;
    }
}

Ahora podemos usar Validador::esCorreoValido($email) en cualquier parte de la aplicación.

Los Namespaces adecuados

Los Namespaces ayudan a organizar el código y evitar conflictos entre clases o funciones que puedan tener el mismo nombre. Especialmente en proyectos grandes, los namespaces son esenciales para mantener el código estructurado.

Ejemplo de código:

namespace MiAplicacion\Modelos;

class Producto {
    // Código de la clase Producto
}

namespace MiAplicacion\Controladores;

use MiAplicacion\Modelos\Producto;

class ControladorProducto {
    // Uso de la clase Producto en un controlador
}

Manejo eficiente de excepciones

Manejar errores adecuadamente es crucial en cualquier aplicación. En lugar de depender de mensajes de error o códigos de retorno, usa excepciones para gestionar condiciones de error de manera más controlada y flexible.

Ejemplo de código donde usamos try/catch:

try {
    // Código que podría lanzar una excepción
    $resultado = realizarOperacionRiesgosa();
} catch (Exception $e) {
    // Manejo de la excepción
    echo "Se produjo un error: " . $e->getMessage();
}

Excepciones con nombre

PHP 8 permite excepciones con nombre específico, lo que hace que el manejo de errores sea aún más preciso.

Veamos el ejemplo, nuevamente con try/catch:

try {
    // Código
} catch (MiExcepcion $e) {
    // Manejo específico de MiExcepcion
}

Los constructores de objetos en PHP 8

PHP 8 introduce una nueva sintaxis más limpia para la inicialización de propiedades en clases. Anteriormente, era necesario definir las propiedades de una clase y luego asignarlas en el constructor. Ahora, con PHP 8, puedes hacerlo directamente en la definición del constructor.

Ejemplo en PHP 7:

class Persona {
    private $nombre;
    private $edad;

    public function __construct(string $nombre, int $edad) {
        $this->nombre = $nombre;
        $this->edad = $edad;
    }
}

Ejemplo en PHP 8:

class Persona {
    public function __construct(private string $nombre, private int $edad) {}
}

Esto reduce el código innecesario y mejora la legibilidad.

Pruebas Unitarias y Test-Driven Development

Es fundamental escribir pruebas unitarias para garantizar que cada parte de tu aplicación funcione como se espera. Herramientas como PHPUnit permiten crear y ejecutar pruebas automatizadas.

Principales beneficios:

Ejemplo de código:

use PHPUnit\Framework\TestCase;

class CalculadoraTest extends TestCase {
    public function testSuma() {
        $calculadora = new Calculadora();
        $this->assertEquals(10, $calculadora->suma(5, 5));
    }
}

Buenas prácticas en PHP: en conclusión

Escribir código PHP de buena calidad no solo se trata de que funcione bien, también resulta fundamental que sea eficiente, legible y fácil de mantener. Con la llegada de PHP 8, las nuevas características como union types y las mejoras en el manejo de excepciones, facilitan la implementación de buenas prácticas.

Más información sobre como obtener la versión más reciente de PHP en https://www.php.net/.

Si te surgen dudas sobre este tema, o si te interesa compartir tu opinión déjame un comentario o escríbeme un mensaje.

Salir de la versión móvil