Menu
Coddy logo textTech

Introduzione ai tratti

Fa parte della sezione Programmazione orientata agli oggetti del percorso PHP di Coddy. Lezione 51 di 91.

PHP supporta solo l'ereditarietà singola: una classe può estendere una sola classe genitore. Ma cosa succede se devi condividere funzionalità tra più classi non correlate? È qui che entrano in gioco i trait.

Un trait è un meccanismo per riutilizzare il codice che ti permette di definire metodi e proprietà che possono essere inseriti in più classi. Considera i trait come un copia-incolla a livello di linguaggio: il codice di un trait diventa parte della classe che lo utilizza.

<?php
trait Timestampable {
    private string $createdAt;
    
    public function setCreatedAt(): void {
        $this->createdAt = date('Y-m-d H:i:s');
    }
    
    public function getCreatedAt(): string {
        return $this->createdAt;
    }
}

class Article {
    use Timestampable;
    
    public function __construct(public string $title) {
        $this->setCreatedAt();
    }
}

$article = new Article("PHP Traits");
echo $article->getCreatedAt();

La parola chiave use all’interno di una classe importa i membri del trait. Ora Article ha accesso a setCreatedAt() e getCreatedAt() come se fossero definiti direttamente nella classe.

Lo stesso trait può essere utilizzato in classi completamente indipendenti, come una classe Comment, una classe User o qualsiasi altra classe che necessiti di funzionalità relative ai timestamp. Questo risolve il limite dell'ereditarietà singola consentendo la condivisione orizzontale del codice all'interno della gerarchia delle classi.

challenge icon

Sfida

Facile

Costruiamo un semplice sistema di saluti che dimostra come i trait consentano di condividere funzionalità tra classi non correlate. Creerai un trait che fornisce la possibilità di salutare, poi lo userai in due classi completamente diverse.

Organizzerai il codice in tre file:

  • Greetable.php: Crea un trait chiamato Greetable che fornisce funzionalità di saluto. Il trait dovrebbe avere:
    • Una proprietà privata $greeting (stringa)
    • Un metodo setGreeting(string $greeting) che memorizza il messaggio di saluto
    • Un metodo greet() che restituisce il messaggio di saluto
  • Person.php: Crea una classe Person che usa il trait Greetable. Includi il file del trait e usa la promozione del costruttore per definire una proprietà pubblica $name. Nel costruttore, chiama setGreeting() per impostare il saluto su "Hello, I'm [name]".
  • Robot.php: Crea una classe Robot che usa anch'essa il trait Greetable. Includi il file del trait e usa la promozione del costruttore per definire una proprietà pubblica $model. Nel costruttore, chiama setGreeting() per impostare il saluto su "Beep boop, I am model [model]".

In main.php, includi entrambi i file delle classi. Riceverai due input: il nome di una persona e il numero di modello di un robot. Crea istanze di entrambe le classi e stampa i loro saluti su righe separate.

Questo dimostra la potenza dei trait: Person e Robot sono classi completamente non correlate e non hanno alcun genitore in comune, eppure acquisiscono entrambe la stessa funzionalità di saluto tramite il trait. Ogni classe personalizza a modo suo l'uso di questa funzionalità.

Provalo tu

<?php

require_once 'Person.php';
require_once 'Robot.php';

// Leggi l'input
$name = trim(fgets(STDIN));
$model = trim(fgets(STDIN));

// TODO: Crea un'istanza di Person con il nome fornito
// TODO: Crea un'istanza di Robot con il modello fornito
// TODO: Stampa il saluto di Person
// TODO: Stampa il saluto di Robot (su una nuova riga)

?>
quiz iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Programmazione orientata agli oggetti

Esercitati da solo: Compilatore PHP online