Principios SOLID en PHP: teoría y práctica para código limpio

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Principios SOLID en PHP: teoría y práctica



SOLID es el acrónimo de cinco principios fundamentales de la programación orientada a objetos, formulados por Robert Martin (Tío Bob). Estos principios ayudan a crear código flexible, mantenible y escalable. En este artículo analizaremos cada principio con ejemplos en PHP y mostraremos cómo aplicarlos en proyectos reales.



1. Single Responsibility Principle (SRP) — Principio de Responsabilidad Única



Esencia: Cada clase debe tener una sola razón para cambiar. En otras palabras, la clase debe ser responsable de una única tarea.



Violación de SRP:

class Order {    public function calculateTotal() { /* ... */ }    public function saveToDatabase() { /* ... */ }    public function sendEmailNotification() { /* ... */ }}


Aquí la clase Order es responsable del cálculo, el guardado y el envío de notificaciones. Esto viola SRP.



Solución:

class Order {    public function calculateTotal() { /* ... */ }}

class OrderRepository { public function save(Order $order) { /* ... */ }}

class EmailNotificationService { public function sendOrderConfirmation(Order $order) { /* ... */ }}


Ahora cada clase tiene una responsabilidad clara, lo que simplifica las pruebas y la modificación.



2. Open-Closed Principle (OCP) — Principio de Abierto/Cerrado



Esencia: Las clases deben estar abiertas para la extensión, pero cerradas para la modificación. Debe poder agregar nueva funcionalidad sin cambiar el código existente.



Violación de OCP:

class PaymentProcessor {    public function process($type) {        if ($type == 'credit_card') {            // procesar tarjeta de crédito        } elseif ($type == 'paypal') {            // procesar PayPal        }    }}


Para agregar un nuevo método de pago, habría que modificar la clase PaymentProcessor.



Solución usando interfaces:

interface PaymentMethod {    public function process();}

class CreditCardPayment implements PaymentMethod { public function process() { /* ... */ }}

class PayPalPayment implements PaymentMethod { public function process() { /* ... */ }}

class PaymentProcessor { public function process(PaymentMethod $method) { $method->process(); }}


Ahora para agregar un nuevo método de pago, solo necesita crear una nueva clase que implemente la interfaz PaymentMethod, sin modificar el código existente.



3. Liskov Substitution Principle (LSP) — Principio de Sustitución de Barbara Liskov



Esencia: Los objetos de las subclases deben ser intercambiables con los objetos de la clase base sin alterar la corrección del programa. La subclase no debe cambiar el comportamiento esperado de la clase base.



Violación de LSP:

class Rectangle {    protected $width;    protected $height;

public function setWidth($w) { $this->width = $w; } public function setHeight($h) { $this->height = $h; } public function getArea() { return $this->width * $this->height; }}

class Square extends Rectangle { public function setWidth($w) { $this->width = $w; $this->height = $w; // violación del principio } public function setHeight($h) { $this->height = $h; $this->width = $h; // violación del principio }}


Si el código cliente espera que cambiar el ancho no afecte la altura, entonces Square violará esa expectativa.



Solución: Evite la herencia si la subclase no se ajusta completamente al comportamiento del padre. Es mejor usar composición o clases separadas:

interface Shape                

Blogs

Book Recommendations