Sobes.tech
Junior

¿Qué son las interfaces en PHP?

sobes.tech AI

Respuesta de la IA

La interfaz en PHP es un contrato que describe un conjunto de métodos (con sus firmas) que una clase debe implementar. Define "qué" hace la clase, pero no "cómo".

  • Contrato: La clase que implementa la interfaz se compromete a proporcionar todos los métodos descritos en ella, con los mismos nombres, parámetros y tipos de retorno.
  • Herencia de tipos: Las interfaces permiten definir tipos basados en comportamiento, no solo en jerarquías de clases. Esto es útil para el polimorfismo. Puedes trabajar con objetos de diferentes clases que implementan una misma interfaz, como si fueran del mismo tipo.
  • Herencia múltiple de comportamiento: PHP no soporta herencia múltiple de clases, pero una clase puede implementar múltiples interfaces. Esto permite que una clase tenga comportamientos de varios contratos.
  • Separación de responsabilidades: Las interfaces ayudan a separar la definición del comportamiento de su implementación.
<?php

// Definición de la interfaz
interface Logger
{
    /**
     * Registra un mensaje de log.
     * @param string $message Mensaje a registrar.
     */
    public function log(string $message): void;
}

// Clase que implementa la interfaz
class FileLogger implements Logger
{
    private string $filePath;

    public function __construct(string $filePath)
    {
        $this->filePath = $filePath;
    }

    public function log(string $message): void
    {
        file_put_contents($this->filePath, $message . PHP_EOL, FILE_APPEND);
    }
}

// Otra clase que implementa la misma interfaz
class DatabaseLogger implements Logger
{
    private $dbConnection; // Se asume un objeto de conexión a la base de datos

    public function __construct($dbConnection)
    {
        $this->dbConnection = $dbConnection;
    }

    public function log(string $message): void
    {
        // Lógica para guardar en la base de datos
        // ...
        echo "Registrando en la base de datos: " . $message . PHP_EOL;
    }
}

// Uso de la interfaz para trabajar con diferentes implementaciones
function processData(Logger $logger, string $data): void
{
    // Procesamiento de datos
    // ...
    $logger->log("Datos procesados: " . $data);
}

$fileLogger = new FileLogger('/var/log/app.log');
$dbLogger = new DatabaseLogger(null); // Mock para ejemplo de conexión a BD

processData($fileLogger, 'Ejemplo de datos 1');
processData($dbLogger, 'Ejemplo de datos 2');

Diferencias principales con las clases abstractas:

Característica Interfaz Clase abstracta
Tipo de miembros Solo métodos (deben ser públicos) Métodos (públicos, protegidos), propiedades
Implementación de métodos No hay implementación (solo firmas) Puede contener métodos implementados
Herencia Una clase puede implementar múltiples interfaces Una clase puede heredar solo de una clase abstracta
Constructor No tiene Puede tener un constructor
Miembros con visibilidad Solo public public, protected