martedì 17 aprile 2012

Concetti di OOP: Cos’è una Classe?

Nel mondo reale, trovi spesso singoli oggetti, tutti dello stesso tipo. Ci sono migliaia di altre biciclette in circolazione, tutte dello stesso produttore e modello. Tutte le biciclette sono state realizzate dallo stesso insieme di stampi e perciò contengono gli stessi componenti. In termini object-oriented, diciamo che la tua bicicletta è un’istanza della classe di oggetti conosciuti come biciclette. Una classe è uno stampo da cui sono creati i singoli oggetti.
La seguente classe Bicicletta è una possibile implementazione per una bicicletta:

<?php
class Bicicletta {

    private $pedalata = 0;
    private $velocita = 0;
    private $marcia   = 0;

    public function cambiaPedalata($nuovoValore){
        $this->pedalata=$nuovoValore;
    }
    public function cambiaMarcia($nuovoValore){
        $this->marcia = $nuovoValore;
    }
 
    public function aumentaVelocità($incremento){
        $this->velocita = $this->velocita + $incremento;
    }
 
    public function frena($decremento){
        $this->velocita = $this->velocita - $decremento;
    }
 
    public function stampaStato(){
        echo $this;
    }
 
    public function __toString() {
        $statoComeTesto=<<<EOT
            <p>
                Pedalata: {$this->pedalata};<br />
                velocità: {$this->velocita};<br />
                marcia: {$this->marcia};
            </p>
EOT;
        return $statoComeTesto;
    }

}
?>
La sintassi del linguaggio potrebbe apparirti nuova, ma il progetto di questa classe è fondato su quanto detto nel precedente post sugli oggetti bicicletta. I campi pedalata, velocita e marcia rappresentano lo stato dell’oggetto, e i metodi (cambiaPedalata, cambiaMarcia, aumentaVelocita ecc.) definiscono l’interazione con il mondo esterno.

La classe così definita non fa nulla all'interno del file sorgente poiché è solo uno stampo per la creazione dei nuovi oggetti Bicicletta. La responsabilità per la creazione degli oggetti e il loro utilizzo dipende da altre classi, funzioni o dal corpo principale dello script.

Ecco un esempio di script che crea due oggetti Bicicletta e invoca i loro metodi:

<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>Pagina di Test per bicicletta</title>
    </head>
    <body>
        <?php
        // Creo due differenti oggetti Bicicletta
        $bici1 = new Bicicletta();
        $bici2 = new Bicicletta();

        // Invoco i metodi sugli oggetti
        $bici1->cambiaPedalata(50);
        $bici1->aumentaVelocità(10);
        $bici1->stampaStato();
     
        $bici2->cambiaPedalata(50);
        $bici2->aumentaVelocità(10);
        $bici2->cambiaMarcia(2);
        $bici2->cambiaPedalata(40);
        $bici2->aumentaVelocità(10);
        $bici2->cambiaMarcia(3);
        echo $bici2;
        ?>
    </body>
</html>

L’output di questo test visualizza nel browser la pedalata, velocità e marcia per le due biciclette:

Output del progetto DemoBicicletta

Nota: Per provare questo programma nel tuo ambiente di sviluppo (per sapere come preparare l'ambiente di sviluppo e creare un progetto fai riferimento ai post precedenti):
  1. Crea un nuovo progetto con nome DemoBicicletta
  2. Cancella il contenuto del file index.php
  3. Copia e incolla la definizione della classe in index.php
  4. Copia e incolla il codice dello script subito dopo la definizione della classe
  5. Salva e scegli Run|Run Project
  6. Volendo puoi anche familiarizzare con xdebug scegliendo Debug|Debug Project. Per procedere un passo alla volta scegli Debug|Step Into o premi F7. Osserva come variano i dati nel pannello Variables e come cambia il pannello Call Stack man mano che vengono invocati i metodi dalla riga di codice  $bici1->stampaStato(); .
    XDebug al lavoro