Ridefinizione dei metodi, ripresa
Fa parte della sezione Programmazione orientata agli oggetti del percorso PHP di Coddy. Lezione 33 di 91.
Hai già imparato l'override dei metodi nel capitolo sull'ereditarietà. Ora scopriamo come si collega al polimorfismo, uno dei concetti più potenti della programmazione orientata agli oggetti.
Il polimorfismo significa «molte forme». Quando esegui l’override di un metodo in una classe figlia, dai a quel metodo una forma diversa mantenendo lo stesso nome. La magia avviene quando lavori con gli oggetti tramite il loro tipo genitore:
<?php
class Animal {
public function speak() {
return "Some sound";
}
}
class Dog extends Animal {
public function speak() {
return "Woof!";
}
}
class Cat extends Animal {
public function speak() {
return "Meow!";
}
}
function makeAnimalSpeak(Animal $animal) {
return $animal->speak();
}
echo makeAnimalSpeak(new Dog()) . "\n";
echo makeAnimalSpeak(new Cat());
Output:
Woof!
Meow!La funzione makeAnimalSpeak() accetta qualsiasi Animal. Non sa né le importa se riceve un Dog o un Cat. PHP chiama automaticamente il metodo sovrascritto corretto in base al tipo effettivo dell'oggetto durante l'esecuzione.
Questo è il polimorfismo in azione.
Questo approccio ti permette di scrivere codice flessibile che funziona con una famiglia di oggetti correlati senza conoscerne i tipi specifici. In seguito puoi aggiungere nuove classi di animali e la funzione funzionerà automaticamente anche con esse.
Punto chiave: L'override dei metodi consente il polimorfismo permettendo a classi diverse di rispondere in modo diverso alla stessa chiamata di metodo, in base al tipo effettivo dell'oggetto determinato in fase di esecuzione.
Sfida
FacileCostruiamo un sistema di strumenti musicali che dimostra il polimorfismo tramite l’override dei metodi. Creerai una classe base Instrument e due classi figlie che producono ciascuna un suono unico, poi userai un’unica funzione per suonare qualsiasi strumento in modo polimorfico.
Organizzerai il codice in quattro file:
Instrument.php: crea una classeInstrumentcon una proprietà protetta$nameimpostata tramite il costruttore. Aggiungi un metodoplay()che restituisce"[name] makes a sound". Questo costituisce il comportamento base che le classi figlie sovrascriveranno.Guitar.php: crea una classeGuitarche estendeInstrument. Includi il file della classe genitore. Il costruttore accetta il nome e lo passa al costruttore della classe genitore. Sovrascrivi il metodoplay()in modo che restituisca"[name] strums a chord".Drum.php: crea una classeDrumche estendeInstrument. Includi il file della classe genitore. Il costruttore accetta il nome e lo passa al costruttore della classe genitore. Sovrascrivi il metodoplay()in modo che restituisca"[name] beats a rhythm".main.php: includi sia il file Guitar sia quello Drum. Crea una funzione chiamataperformWithche accetta un parametroInstrument(con indicazione del tipo) e restituisce il risultato della chiamata aplay()su di esso. Questa funzione dimostra il polimorfismo: funziona con qualsiasi tipo di strumento grazie all’indicazione del tipo della classe genitore.
Riceverai due input: un nome per la chitarra e un nome per il tamburo. Crea una Guitar e un Drum con questi nomi. Passali uno alla volta alla funzione performWith() e stampa i risultati: prima la chitarra, poi il tamburo, ciascuno su una riga separata.
Nota come performWith() accetti qualsiasi Instrument, eppure PHP chiami automaticamente il metodo play() sovrascritto corretto in base al tipo effettivo dell’oggetto durante l’esecuzione. Questo è il polimorfismo in azione!
Provalo tu
<?php
// Includi i file degli strumenti
require_once 'Guitar.php';
require_once 'Drum.php';
// Leggi l'input
$guitarName = trim(fgets(STDIN));
$drumName = trim(fgets(STDIN));
// TODO: Crea una funzione chiamata performWith che:
// - Accetta un parametro Instrument (usa la dichiarazione di tipo: Instrument $instrument)
// - Restituisce il risultato della chiamata a play() sullo strumento
// TODO: Crea una Guitar con $guitarName e un Drum con $drumName
// TODO: Passa entrambi a performWith() e stampa i risultati (prima la chitarra, poi il tamburo)
?>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