Menu
Coddy logo textTech

Uso de múltiples Traits

Parte de la sección Programación Orientada a Objetos del Journey de PHP de Coddy. Lección 52 de 91.

Un solo trait es útil, pero el verdadero poder aparece cuando combinas varios traits en una clase. PHP te permite incluir tantos traits como necesites, proporcionando a tu clase capacidades de varias fuentes a la vez.

Para usar múltiples traits, simplemente enuméralos separados por comas después de la palabra clave use:

<?php
trait Timestampable {
    public function getTimestamp(): string {
        return date('Y-m-d H:i:s');
    }
}

trait Identifiable {
    private string $id;
    
    public function generateId(): void {
        $this->id = uniqid('id_');
    }
    
    public function getId(): string {
        return $this->id;
    }
}

class Post {
    use Timestampable, Identifiable;
    
    public function __construct(public string $title) {
        $this->generateId();
    }
}

$post = new Post("Hello World");
echo $post->getId() . " - " . $post->getTimestamp();

Salida:

id_6789abc123 - 2024-01-15 10:30:00

La clase Post ahora tiene métodos de ambos traits. Cada trait aporta su propia funcionalidad: Timestampable proporciona métodos relacionados con el tiempo, mientras que Identifiable gestiona los ID únicos. Este enfoque mantiene cada trait centrado en una única responsabilidad, lo que hace que tu código sea más modular y reutilizable.

¿Qué ocurre cuando dos traits tienen métodos con el mismo nombre? Esa es una situación de conflicto que exploraremos en la próxima lección.

challenge icon

Desafío

Fácil

Construyamos un sistema de gestión de productos que combine múltiples traits para proporcionar a los productos capacidades tanto de precios como de inventario. Cada trait gestionará una única responsabilidad, y tu clase de producto obtendrá funcionalidad de ambos.

Organizarás tu código en tres archivos:

  • Priceable.php: Crea un trait llamado Priceable que gestione la funcionalidad de precios. El trait debe tener:
    • Una propiedad privada $price (float)
    • Un método setPrice(float $price) que almacene el precio
    • Un método getPrice() que devuelva el precio
    • Un método getFormattedPrice() que devuelva el precio con el formato "$[price]" y 2 decimales
  • Stockable.php: Crea un trait llamado Stockable que gestione el inventario. El trait debe tener:
    • Una propiedad privada $stock (integer)
    • Un método setStock(int $quantity) que almacene la cantidad en stock
    • Un método getStock() que devuelva el stock actual
    • Un método isInStock() que devuelva true si el stock es mayor que 0, y false en caso contrario
  • main.php: Incluye ambos archivos de traits y crea una clase Product que use los traits Priceable y Stockable. Usa la promoción del constructor para definir una propiedad pública $name. El constructor también debe aceptar un precio y una cantidad de stock, utilizando los métodos de los traits para establecerlos.

    Recibirás tres entradas: el nombre de un producto, un precio y una cantidad de stock. Crea un producto con estos valores e imprime cuatro líneas:

    • El nombre del producto
    • El precio formateado (usando getFormattedPrice())
    • La cantidad de stock
    • "Available" si hay stock, o "Out of stock" si no lo hay

Esto demuestra cómo funcionan conjuntamente múltiples traits. Tu clase Product obtiene capacidades de gestión de precios de un trait y de gestión de inventario de otro, manteniendo cada responsabilidad claramente separada y combinándolas en un producto completamente funcional.

Pruébalo tú mismo

<?php
require_once 'Priceable.php';
require_once 'Stockable.php';

// TODO: Crea una clase Product que use ambos traits Priceable y Stockable
// Usa la promoción de constructor para la propiedad pública $name
// El constructor debe aceptar name, price y stock, y usar métodos de los traits para establecer price y stock

class Product {
    // TODO: Usa los traits aquí

    // TODO: Implementa el constructor con promoción de constructor para $name
    // y establece price y stock usando métodos de los traits
}

// Leer la entrada
$name = trim(fgets(STDIN));
$price = floatval(trim(fgets(STDIN)));
$stock = intval(trim(fgets(STDIN)));

// TODO: Crea una instancia de Product con los valores de entrada

// TODO: Imprime el nombre del producto
// TODO: Imprime el precio formateado usando getFormattedPrice()
// TODO: Imprime la cantidad de stock
// TODO: Imprime "Available" si está en stock, o "Out of stock" si no
?>
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Programación Orientada a Objetos

Practica por tu cuenta: Compilador de PHP online