Con l'avvento di PHP 5 il modo di concepire la programmazione ad oggetti in PHP è cambiato radicalmente. Il modello ad oggetti semplificato che era presente fino alla versione 4 non è che un'ombra scialba di quello attuale. Prima gli oggetti erano solamente una funzionalità di supporto poco utilizzata e veramente troppo poco flessibile. Ora gli sviluppatori possono puntare su un supporto alla programmazione ad oggetti che avvicina il linguaggio ai concorrenti più blasonati.
In PHP 5 la definizione di una classe rispecchia molto più da vicino le esigenze degli sviluppatori entrerprise. Vediamo di analizzare la sintassi utilizzata con dei brevi esempi.
La definizione di una classe avviene utilizzando una sintassi simile a quella precedente, anche se possiamo notare grosse differenze. In primo luogo il costruttore della classe ora non deve avere lo stesso nome della classe stessa ma deve chiamarsi __construct
; in secondo luogo abbiamo la possibilità di definire dei distruttori (implementati nel metodo __destruct
) che verranno chiamati ogni qualvolta il garbage collector di PHP distruggerà l'oggetto. Oltre a queste piccole differenze, finalmente è possibile specificare la visibilità di metodi ed attributi attraverso le parole chiave public, protected e private. Vediamo un semplice esempio di classe:
<?php
class Prova
{
public $attr_public;
private $attr_private;
protected $attr_protected;
public function __construct()
{
// operazioni di inizializzazione
}
public function __destruct()
{
// operazioni eseguite prima della distruzione
}
public function publicMethod()
{
}
protected function protectedMethod()
{
}
private function privateMethod()
{
}
}
?>
Oltre queste differenze ora è possibile (e necessario) specificare esplicitamente quali metodi o proprietà dovranno essere statiche. Solo le proprietà o i metodi statici possono essere acceduti utilizzando l'operatore ::
, mentre prima PHP permetteva l'utilizzo di quell'operatore per qualunque metodo.
Quindi la definizione di un metodo proprietà statica presuppone l'anteposizione della parola chiave static
prima della definizione.
Ovviamente l'ereditarietà è ancora supportata, ma grazie alle aggiunte è notevolmente migliorata. Difatti possiamo sfruttare la possibilità di definire la visibilità di metodi e proprietà per facilitare il design dell'applicazione.
<?php
class ExtProva extends Prova
{
public function __construct()
{
parent::__construct();
}
private function provaProtected()
{
$this-> protectedMethod();
}
}
?>