Object Oriented Programming

Dato che è stata introdotta successivamente, la programmazione ad oggetti in PHP4 può risultare limitata, soprattutto a chi
ha avuto modo di sperimentare questo paradigma di programmazione in altri ambiti come ad esempio Java.

L'elemento fondamentale della OOP è la classe, una classe contiene la definizione di dati (in terminologia Object Oriented: proprietà) e di funzioni (metodi) che condividono alcune caratteristiche tali da suggerirne l'incapsulamento in una singola struttura, la classe appunto.

La definizione di una classe utilizza l'istruzione class:


class la_mia_prima_classe
{
var $variabile;

function la_mia_prima_classe ($in)
{
   $this->variabile = $in;
}
}


Le proprietà vengono definite tramite l'istruzione var seguite dal nome della variabile, successivamente abbiamo definito il metodo la_mia_prima_classe, si noti come questo metodo abbia lo stesso nome della classe, questo fatto lo identifica come costruttore della classe. Un costruttore di una classe viene invocato automaticamente dall'interprete PHP quando la classe viene istanziata, quando cioè viene creato un oggetto di quella classe.
All'interno del costruttore abbiamo assegnato il valore della variabile $in alla proprietà $variabile tramite il costrutto $this->variabile = $in;, la variabile $this si riferisce all'oggetto corrente e può essere utilizzato solo all'interno di un metodo di una classe.
Sempre all'interno della definizione di una classe è possibile fare riferimento ai metodi utilizzando la sintassi $this->metodo.

Una classe non può essere utilizzata direttamente dato che in effetti non è niente altro che una dichiarazione di proprietà e metodi che definiscono quindi un particolare tipo di dato. Quello che ci permette di utilizzare queste definizione è la creazione di un oggetto come istanza della particolare classe:

$oggetto = new la_mia_prima_classe("qualcosa in input");
print $obj->variabile;

L'operatore new crea una nuova istanza di la_mia_prima_classe e la assegna a $oggetto.
Il codice quindi produrrà l'output:
qualcosa in input

I metodi della classe definita possono essere utilizzati sia dinamicamente cioè istanziando un oggetto (è il caso dell'esempio precedente) sia in modo statico cioè utilizzando la classe come un namespace. Vediamo un esempio:

class seconda_classe
{
var $variabile;

function seconda_classe ($in)
{
  $this->$variabile = $in;
}

function moltiplica ($num1, $num2)
{
  return $num1*$num2;
}
}

print seconda_classe::moltiplica(1234,4321);

utilizzando l'operatore :: possiamo utilizzare staticamente il metodo (la funzione) moltiplica che abbiamo definito all'interno della classe.

Uno dei problemi che si riscontra più spesso utilizzando gli oggetti in PHP4 è dovuto al fatto che quando si passa un oggetto come argomento di una funzione, esso viene trattato esattamente come ogni altro tipo di dato, viene cioè passato per valore: l'interprete crea una copia dell'oggetto e la passa alla funzione,tale copia verrà distrutta altermine dell'esecuzione della funzione stessa.

Una delle prerogative della OOP è la ereditarietà: la possibilità cioè di definire una classe figlio che mutui dalla classe padre le proprietà e i metodi avendo la possibilità di aggiungerne di nuovi. In PHP4 l'ereditarietà viene attuata tramite l'estensione di una classe:

class padre
{
var $var_padre;

function padre ($in)
{
  $this->$variabile = $in;
}

function moltiplica ($num)
{
  return $this->var_padre * $num;
}
}

class figlio extends padre
{
var $var_figlio;

function figlio ($in)
{
  $this->var_figlio = $in;
  $this->var_padre = $in + 100;
}
}

$oggetto = new figlio (2);
print $oggetto->moltiplica(4);

come si può notare anche istanziando un oggetto di classe figlio possiamo utilizzare direttamente il metodo moltiplica che avevamo definito nella classe padre.

Quando si renda necessario passare degli oggetti tra diverse pagine PHP è possibile serializzare gli oggetti cioè indicare all'interprete PHP di esportare le propietà attuali dell'oggetto, cosi da poterle passare come parametri GET o POST alla pagina successiva che potrà cosi "ricostruire" l'oggetto.
Le funzioni che possiamo utilizzare sono
serialize($oggetto)
e
unserialize($oggetto)

PHP rende inoltre disponibili due funzioni "magiche" (per "magiche" si intende che indicando il nome esatto della funzione l'interprete associerà un comportamento particolare):

__sleep()

e

__wakeup()

La prima (per "addormentare" l'oggetto) verrà eseguita ogni volta che un oggetto della classe viene serializzato, la seconda invece (quindi per "svegliare" l'oggetto) quando esso viene de-serializzato.

Privacy Policy