Prima di addentrarci nello studio vero e proprio dei concetti e delle teorie della programmazione ad oggetti, è bene avere le idee chiare sulle differenze che questo modello di programmazione pone rispetto al più semplice modello procedurale.
Questo perché molti sviluppatori PHP hanno probabilmente a disposizione un solido bagaglio di conoscenze sul codice procedurale, soprattutto chi ha lavorato a lungo con la versione 4. Per una completa analisi delle differenze teoriche, dei vantaggi e degli svantaggi tra modello ad oggetti e modello procedurale, l'articolo Codice procedurale vs OOP è un ottimo punto di riferimento.
Un wrapper per la stampa
Partiamo subito con un esempio pratico che ci permetterà di cogliere le rispettive differenze concettuali dei due modelli: un wrapper per stampare un paragrafo HTML contente del testo.
Codice procedurale:
function ph($txt) {
echo "<p>" . $txt . "</p>";
}
// stampa il seguente HTML: "<p>This is a paraghrap</p>"
ph("This is a paraghrap");
Codice OOP:
class HTML {
public function ph($txt) {
echo "<p>" . $txt . "</p>";
}
}
$html = new HTML();
// stampa il seguente HTML: "<p>This is a paraghrap</p>"
$html->ph("This is a paraghrap");
La prima, lampante differenza che emerge dal confronto tra questi due snippet è la diversa quantità di codice necessaria per giungere allo stesso fine: il modello OOP ne richiede infatti d più. La seconda differenza è che, mentre nel primo caso si può usare direttamente la funzione e quindi stampare il codice, nel secondo si deve prima istanziare un oggetto della classe HTML
(il cui nome è scelto a nostro piacimento) e successivamente richiamare il metodo denominato ph
.
Ma vediamo cosa accade se successivamente decidiamo di aggiornare le funzionalità volendo creare un ulteriore wrapper al paragrafo risultante, ovvero un elemento div
, ed ottenere il seguente markup: <div><p>This is a paraghrap</p></div>
:
Codice procedurale:
function div($txt) {
echo "<div>";
ph($txt);
echo "</div>";
}
// stampa il seguente HTML: "<div><p>This is a paraghrap</p></div>"
div("This is a paraghrap");
Codice OOP:
class HTML {
public function ph($txt) {
echo "<p>" . $txt . "</p>";
}
public function div($txt) {
echo "<div>";
$this->ph($txt);
echo "</div>";
}
}
$html = new HTML();
// stampa il seguente HTML: "<div><p>This is a paraghrap</p></div>"
$html->div("This is a paraghrap");
Come è possibile notare, nel caso del modello procedurale si deve procedere alla creazione di una nuova funzione che richiama la precedente, mentre nel modello OOP tutta l'implementazione è centralizzata in un unico oggetto: la classe HTML
. Le istanze di questa classe (nel nostro caso l'oggetto $html
) possono usufruire di tutte le funzioni pubbliche dichiarate nella stessa.