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.
Sfida
FacileCostruiamo 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 chiamatoGreetableche 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
- Una proprietà privata
Person.php: Crea una classePersonche usa il traitGreetable. Includi il file del trait e usa la promozione del costruttore per definire una proprietà pubblica$name. Nel costruttore, chiamasetGreeting()per impostare il saluto su"Hello, I'm [name]".Robot.php: Crea una classeRobotche usa anch'essa il traitGreetable. Includi il file del trait e usa la promozione del costruttore per definire una proprietà pubblica$model. Nel costruttore, chiamasetGreeting()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)
?>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
1Fondamenti della programmazione orientata agli oggetti
File esterniIntroduzione alla programmazione orientata agli oggettiClassi e oggettiLa parola chiave $thisMetodiProprietàCostruttore (__construct)Distruttore (__destruct)Riepilogo - Calcolatrice semplice4Ereditarietà
Ereditarietà di baseLa parola chiave parent::Sovrascrittura dei metodiLa parola chiave finalClassi astratteRiepilogo - Gerarchia dei dipendenti7Incapsulamento
Pubblico, Protetto, PrivatoApprofondimento sui modificatori di accessoGetter e SetterOccultamento delle informazioniPromozione dei parametri del costruttore (8.0)Riepilogo - Sistema di gestione dei registri degli studenti10Concetti avanzati di programmazione a oggetti
Composizione vs ereditarietàDependency InjectionClassi anonimeEnumerazioni (PHP 8.1)Fibers (PHP 8.1)Approfondimento sulla clonazione degli oggettiGeneratori e iteratori13Modelli di progettazione, parte 2
Modello CommandModello AdapterModello DecoratorModello Template MethodModello StateModello CompositeModello Repository2Namespace e autoloading
Introduzione ai namespaceLa keyword useStandard di autoloading PSR-4Autoloader di ComposerRiepilogo - Progetto organizzato5Interfacce e contratti
Introduzione alle interfacceImplementare le interfacceImplementare più interfacceInterfaccia vs classe astrattaType hinting con le interfacceRiepilogo - Calcolatore di forme8Metodi magici
Introduzione ai metodi magici__toString e __debugInfo__get, __set, __isset, __unset__call e __callStatic__clone e clonazione degli oggetti__serialize e __unserializeRiepilogo - Collezione personalizzata11Sistema dei tipi e gestione degli errori
Dichiarazioni di tipoTipi nullableTipi unione e intersezioneClassi di eccezioneGerarchia di eccezioni personalizzataTry, Catch, FinallyRiepilogo - Validatore di moduli14Progetto: Gestione della biblioteca
Panoramica del progettoClassi Libro e Utente3Proprietà delle classi
Proprietà di istanza e staticheCostanti nelle classiMetodi e proprietà staticiProprietà private e protectedProprietà readonly (PHP 8.1)Riepilogo - Gestore di conti bancari6Polimorfismo
Ridefinizione dei metodi, ripresaPolimorfismo tramite interfacceSuggerimenti sui tipi e tipi UnionBinding statico tardivoRiepilogo - Processore di pagamenti9Tratti
Introduzione ai trattiUtilizzare più trattiRisoluzione dei conflitti tra trattiMetodi astratti nei trattiTratti vs ereditarietà12Design pattern - Parte 1
Introduzione ai design patternPattern SingletonPattern FactoryPattern ObserverPattern StrategyEsercitati da solo: Compilatore PHP online