Pur avendo una primitiva presenza già nella versione 4, e solo dalla versione 5 in poi che PHP sono stati introdotti per i Programmatori PHP diversi elementi che ne consentono l'utilizzo orientato agli oggetti, in quest'articolo inizieremo a valutarne alcuni aspetti fondamentali che aiuteranno a capire alcune delle funzionalità di questa tipologia programmativa.
In quest'esempio valuteremo due aspetti teorici che possono introdurre un Programmatore di codice PHP allo programmazione orientata agli oggetti.
Pur ritenendo probabilmente sufficiente la programmazione procedurale per una moltitudine di progetti di medio/bassa complessità, credo sia necessaria o utile abituarsi a questa tipologia programmativa in modo da sfruttarne tutti gli aspetti in progetti più complessi. Per un Programmatore PHP infatti i costrutti ad Oggetti rappresentano una notevole chance nel rispettare e nel seguire le regole tracciate dall'ingegneria del software come la Scalabilità, Modularità, Controllo dei Bug, Incapsulamento.
Dato per scontata la conoscenza dei i concetti base della programmazi classi (Le classi sono uno strumento per costruire strutture dati che contengano non solo dati ma anche il codice per gestirli), oggetti(Un oggetto è una istanza di una classe), metodi(procedure che operano su un oggetto) e attributi(variabili di una classe).
in quest'articolo/esempio illustreremo due concetti importantissimi alla base di questa tipologia programmativa: L'ereditarietà e il polimorfismo.

Un Programmatore PHP che utilizza la programmazione ad oggetti potrà definire una classe che rappresenta dei metodi e degli attributi comuni a più classi derivate. L'esempio più classico usato nei libri didattici è quello delle forme giometriche come possiamo vedere nell'esempio UML.
La classi forme (rettangolo e quadrato) ereditano dalla classe che estendono l'attributo area e il metodo calcolaArea, essendo già definite non sarà bisogno ridefinirle, al contrario però possono aggiungere dei metodi o delle funzionalità estendendo i concetti della prima.
Quest'esempio puà bastare a far capire ad un Programmatore PHP l'utilità di questa tipologia programmativà.
Infatti sarà possibile raggruppare in una sola classe gli elementi comuni ad un gruppo di classi appartenenti allo stesso genere, questo permetterà in caso di un aggiornamento o dell'inserimento di un nuovo metodo o attributo comune, di non dover modificare le singole classi ma di poter modificare la classe genitore (o superclasse) in modo da modificare contemporaneamente tutti gli oggetti gerarchicamente connessi.
A questo punto un Programmatore PHP avrà bisogno, di approfodire un altro concetto strettamente legato al precedente: Il Polimorfismo.
Il Polimorfismo la capacità di una classe derivata di ridefinire un metodo con lo stesso nome del metodo ereditato, modificandone il comportamento, quindi è la capacità di avere comportamenti diversi per metodi con lo stesso nome, appartenenti a oggetti gerarchicamente connessi tra loro.
Riprendendo l'esempio precedente, le due forme rettangolo e quadrato non hanno bisogno di ridefinire il metodo calcolaArea poichè la formula definita nella metodo forma è lato per lato, utile ad ambedue. Se però aggiungiamo altre figure avremmo la necessità di ridefinire il metodo calcolaArea poichè per il cerchio o per il trapezio tale formula sarà differente.
Questa funzionalità programmativa permette ad un Programmatore PHP una condivizione di metodi parziale, cioè di definire oggetti tra loro molto simili, derivati ma non del tutto identici.
Nell'esempio successivo, "volutamente banale" ho supposto che una nota produttrice di lettori MP3 crei un software er gestire un lettore. In una prima versione i jack per la trasmissione è uno, ma successivamente sviluppa un lettore con due jack di trasmissione,quindi pur mantenendo quelle che sono le funzionalità base del lettore (aventi,indietro,etc.) il lettore modifica il metodo trasmettiMusica affinchè possa trasmettere due segnali.
Questo permette alla classe software di non modificare il software precedente ma di definire una classe che eredità metodi e attributi e polimorfizza uno dei metodi.
//Questa è la prima versione di lettore MP3
class mp3Player {
//Parto dalla traccia 1
public $traccia = 1;
//La funzione Play trasmette la traccia alla cuffia dell'ascoltatore
public function play() {
echo "il walkmen prima versione trasmette la traccia:".$this->traccia." alle Cuffie dell'ascoltatore<br/>";
}
//Metodo che va avanti di 1 traccia
public function avanti() {
$this->traccia++;
}
//Metodo che va indietro di 1 traccia
public function indietro() {
$this->traccia--;
}
}
//La nuove classe estensione della vecchia tipologia
class mp3Player_nuovaVersione extends mp3Player {
//Ne eredita i metodi e gli attributi ma ne polimorfizza la funzione play per trasmettere su due canali
public function play($persona1,$persona2) {
echo "il walkmen nuova versione trasmette la traccia:".$this->traccia." alle Cuffie di $persona1<br/>";
echo "il walkmen nuova versione trasmette:".$this->traccia." alle Cuffie di $persona2<br/>";
}
}
//Avvia il Programma
//Giulio ha il lettore vecchi quindi con play ascolta la musc
$lettoreGiulio = new mp3Player();
$lettoreGiulio->play();
//Marco ha la nuova versione
$lettoreMarco = new mp3Player_nuovaVersione();
//Utilizza un metodo ereditato
$lettoreMarco->avanti();
//Condivide l'ascolto con Alberto e utilizza la nuova funzione play
$lettoreMarco->play("Marco","Alberto");
//Quindi il lettore di secondo tipo può essere banalmente utilizzato come primo tipo (cioè ascolto a singolo jack)
//e il su software può essere sviluppato in poco, semplicemente estendendo il precedente.
