Arhitectură Orientată pe Obiecte (OOP) în PHP Modern: Interfețe, Trait-uri și PSR-4 în PHP

Clase și obiecte PHP 8.x Architecture

Principii SOLID în PHP: cum proiectezi clase curate cu interfețe, compoziție prin trait-uri, dependency injection și structurarea proiectelor cu Composer și standardul PSR-4.

Sintaxă
interface RepositoryInterface { ... } class Service { use LoggableTrait; ... }

Scrierea de cod PHP profesional presupune respectarea principiilor de arhitectură software SOLID și a standardelor definite de grupul PHP-FIG (PHP Framework Interop Group), în special standardul de încărcare automată a claselor PSR-4.

Design curat bazat pe Interfețe și Dependency Injection (DI)
<?php

declare(strict_types=1);

namespace App\Services;

// 1. Contractul / Interfața: decuplează logica de business de implementarea concretă
interface NotificareSenderInterface {
    public function trimite(string $destinatar, string $mesaj): bool;
}

// 2. Implementare concretă 1 (Email via SMTP)
class EmailNotificareSender implements NotificareSenderInterface {
    public function trimite(string $destinatar, string $mesaj): bool {
        // Trimitere email...
        return true;
    }
}

// 3. Implementare concretă 2 (SMS)
class SmsNotificareSender implements NotificareSenderInterface {
    public function trimite(string $destinatar, string $mesaj): bool {
        // Trimitere SMS...
        return true;
    }
}

// 4. Clasa de business injectează interfața (Inversion of Control - IoC)
class ComandaService {
    // Constructor Property Promotion + Type Hinting pe interfață
    public function __construct(
        private readonly NotificareSenderInterface $notificator
    ) {}

    public function finalizeazaComanda(int $comandaId, string $contact): void {
        // Procesare comandă...
        $this->notificator->trimite($contact, "Comanda #{$comandaId} a fost confirmată!");
    }
}

// Instanțiere flexibilă (ușor de testat cu obiecte Mock în teste unitare!):
$service = new ComandaService(new EmailNotificareSender());
$service->finalizeazaComanda(1042, 'client@exemplu.ro');

Structurarea Fișierelor prin Standardul PSR-4 și Composer

În fișierul composer.json, asociază spațiul de nume (namespace) cu directorul de fișiere:

{
    "autoload": {
        "psr-4": {
            "App\\": "src/"
        }
    }
}

După rularea comenzii composer dump-autoload, o clasă cu namespace-ul App\Services\ComandaService va fi localizată și încărcată automat de către PHP din fișierul fizic src/Services/ComandaService.php, fără a fi nevoie de instrucțiuni manuale require_once.