[PHP] – Object Oriented Programming

Il PHP supporta la programmazione orientata agli oggetti (OOP – Object Oriented Programming). In parole povere, ma che dico povere… nulla tenenti, la programmazione orientata agli oggetti permette di definire un’oggetto, un costrutto. Qualcosa che si costruisce partendo da determinate istruzioni.

Cosa costruiamo?
Ovviamente l’oggetto : - ) . Definendolo come una classe.

Cos’è una classe?
Una classe è una collection di variabili e funzioni che sfruttano le variabili stesse.

Com’è strutturata una classe?
Ne definiamo le variabili da utilizzare prima di ogni cosa. Successivamente richiamiamo le variabili e le manipoliamo con delle funzioni. Esattamente come facciamo nella programmazione semplice del php.

Perchè scegliere la OOP per il PHP?
Per fare del nostro codice un insieme ben organizzato. E’ molto più semplice gestire gli oggetti, che gestire singole righe di codice, la cui interdipendenza a volte può risultare controproducente.

Che oggetti posso costruire?
Di tutto! : - ) . Se volete potete anche fare un piatto di pasta! Non mi credete? Ecco come fare.

   class pasta_asciutta{
     
      //Stabilisco le variabili necessarie
      //per fare un piatto di pasta
      var $pasta;
      var $salsa_pomodoro;
      var $sale;
      var $olio_oliva;
      var $tempo_cottura;
     
      //Quando gli ingredienti sono pronti
      //posso servire la pasta!
      function pasta_pronta(){
        $this->preparazione_salsa();
        $this->preparazione_pasta();
       
        echo "<br />La pasta e’ in tavola!";
       }
     
      //Cucino la pasta
      function preparazione_pasta(){
        $this->pasta * $this->tempo_cottura;
        echo "La pasta e’ pronta<br />";
       }
     
     
      //Cucino la salsa
      function preparazione_salsa(){
        $this->salsa = ($this->salsa_pomodoro + $this->sale + $this->olio_oliva);
        $this->preparazione_salsa = $this->salsa * $this->tempo_cottura;
       
        echo "La salsa e’ pronta<br />";
       }
   }

 //Richiamo la classe che mi permette di preparare la pasta 
 $pasta = new pasta_asciutta;

 //Servo in tavola!!!
 $pasta->pasta_pronta();   

Ho definito le variabili che mi servono per fare la pasta: olio, sale, salsa… Ho costruito tre funzioni, una per la salsa, una per la cottura della pasta ed una per servire il tutto.
Ho trasformato le variabili stabilite in alto, combinandole fra di loro, in modo da ottenere un piatto di pasta! : - )

Richiamo le variabili con un $this->nome_variabile, proprio perchè andremo a richiamare la variabile di quel particolare oggetto.

Avrete notato anche che la classe non va in automatico. Non posso richiamare tout court le funzioni dell’oggetto fuori da questo.
Seppur l’oggetto è definito bene, questo necessita di essere successivamente mandato in loading. Per farlo basterà impostare una nuova variabile (nell’esempio $pasta) e richiamare la classe con l’operatore new.
La cosa è necessaria perchè le classi devono essere considerate come dei modelli. Di base una classe non modifica le variabili, ma da le istruzioni ad un altra variabile impostata, che sfrutterà il modello di persing dettato dalla classe.

Un esempio meno campato per aria?
Dal punto di vista culinario è un bel esempio, ma dal punto di vistra pratico del PHP, forse sarebbe meglio fare un esempio più concreto. Adesso proveremo ad adattare quanto visto sopra ad un driver di connessione al nostro server MySQL, e ad un particolare database del server.

class db {

  var $host = ‘localhost’;
  var $user = ‘root’;
  var $pass = ”;
  var $dbname = ‘php2’;/*Ne ho preso uno a caso… voi cambiatelo a piacimento*/
 
  var $dbconn;
 
  var $dbloading;
 
  function connection(){
    if(!$this->dbconn = mysql_connect($this->host,$this->user,$this->pass)){
      echo "Ci sono stati problemi durante la connessione al server MySQL<br />";
      exit;
    }else{
      echo "Connessione al server MySQL effettuata con successo!!!<br />";
     
      $this->load_db($this->dbname);
    }
  }
 
  function load_db($database){
    if(!$this->dbloading = mysql_select_db($database,$this->dbconn)){
      echo "Ci sono stati problemi durante la connessione al database " . $database;
    }else{
      echo "Connessione al database " . $database . " effettuata con successo!!!";
    }
  }
}

$test = new db;
$test->connection();

Facile no?! Ho le variabili che mi servono. Le imposto per come mi servono e poi creo la variabile $test che userà come modello la classe db. E la connessione è stata avviata con successo : - ) .

Classi Estese
Il PHP supporta anche le classi estese. Succede infatti che si debba definire una nuova classe e questa utilizzi gran parte delle variabili e delle funzioni che utilizza un’altra classe.
Definendo una classe estesa possiamo utilizzare le stesse variabili e funzioni di un’altra classe!

Per fare un esempio, possiamo riutilizzare lo stesso esempio fatto prima, scindendo le due operazioni base di connessione (connessione al server e selezione del database target) in due classi.

class db {

  var $host = ‘localhost’;
  var $user = ‘root’;
  var $pass = ”;
 
  var $dbconn;
 
  function connection(){
   
    if(!$this->dbconn = mysql_connect($this->host,$this->user,$this->pass)){
      echo "Ci sono stati problemi durante la connessione al server MySQL<br />";
      exit;
    }else{
      echo "Connessione al server MySQL effettuata con successo!!!<br />";
    }
  }
}

class dbsel extends db{

  var $dbname = ‘php2’;
 
  var $load_db;
 
  function load_db($database){
    if(!$this->dbloading = mysql_select_db($database,$this->dbconn)){
      echo "Ci sono stati problemi durante la connessione al database " . $database;
    }else{
      echo "Connessione al database " . $database . " effettuata con successo!!!";
    }
  }
}

$test = new dbsel;
$test->connection();
$test->load_db($test->dbname);

Usando la sintassi extends nella classe dbsel ho importato (se così si può dire) tutte le variabili e le funzioni della classe db. E difatti ho potuto usare in dbsel, la viariabile $this->dbconn, creata nella precedente classe.
E vi accorgerete pure che la variabile $test richiama solo dbsel a modello, salvo poi mandare in loading la funzione connection() definita nella classe db.
Ciò è stato possibile perchè ho esteso db a dbsel.

Ovviamente le implicazioni della programmazione orientata agli oggetti sono molto più grandi e complicate, ma questo potrebbe essere un buon inizio! E non dimenticate di leggere il manuale ; - ) .

4 thoughts on “[PHP] – Object Oriented Programming”

  1. sarà quasi un anno ke mi riprometto di impare qst diavolo di php e nn mi decido mai fermamente.. anche perchè non ho idea se dover comprare per forza un libro o se si trova un valido ebook su internet..

  2. Io avrei dichiarato una superclasse pasta e poi avrei ereditato pasta_asciutta.

    Comunque ASP.NET ruleggia 8 - )

Comments are closed.