OOP IN PHP QUARTA PARTE

LE KEYWORD $THIS, SELF, PARENT E STATIC

php logoInizialmente non è semplice orientarsi, facciamo allora un breve riepilogo. Con la keyword $this abbiamo un riferimento all’istanza creata, e la utilizziamo all’interno delle classi per accedere a proprietà e metodi non statici, cioè che sono propri degli oggetti. I metodi e proprietà statiche appartengono alla classe e non rientrano nel campo delle istanze. Con la keyword self abbiamo un riferimento alla classe stessa e la adoperiamo per accedere a proprietà e metodi statici oppure a costanti.

Accedere a una proprietà statica con self

ACCEDERE AI METODI CON LE KEYWORD PARENT E SELF

Nella figura a fianco è riportato un esempio su come usare le keyword parent e self.

Ereditarietà

Con static possiamo riferirci non alla classe stessa ma alla classe figlia.

CREARE UN’ISTANZA DI UNA CLASSE CON SELF E STATIC

Quando creiamo l’istanza con la keyword new viene invocato automaticamente il costruttore. Se anziché rendere il costruttore public lo rendiamo private cosa succede? Se proviamo a creare un’istanza esterna alla classe abbiamo un errore fatale. Se dichiariamo un metodo come private o protected non possiamo accedervi esternamente (dallo scoop globale). Solo all’interno della classe possiamo creare un’istanza.

costruttore privato

Questo può essere utile quando vogliamo creare una singola istanza di una certa classe (pattern singleton). Possiamo ritornare anche new static, la differenza è nel contesto dell’ereditarietà, in questo caso cioè con static viene ritornato un oggetto della classe child B (vedi figura a lato).

classi child

DEEP E SHALLOW COPY DI UN OGGETTO

Vediamo come effettuare la copia di un oggetto, se assegniamo l’oggetto di una classe ad un’altra variabile non avviene la copia in quanto l’assegnamento è  per riferimento. Vediamo un esempio:

$obj1 = new stdClass();

$obj2 = $obj1;

var_dump($obj1,$obj2);

stdclass

CREAZIONE CLASSE USER

Creiamo una classe User in questo modo, sotto viene riportato anche il var_dump();

User
var_dump

LA KEYWORD CLONE

Abbiamo due riferimenti allo stesso oggetto, stesso ID, e stesse proprietà id e nome. Se vogliamo clonare un oggetto prima dell’assegnamento usiamo la keyword clone.

$user2 = clone $user1;

Se adesso facciamo il var_dump() abbiamo due oggetti diversi identificati da diversi ID.

clone

Se modifichiamo la proprietà nome tramite $user2 avremo:

clone method
var_dump 2

IL METODO MAGICO __CLONE

Adesso il problema è che abbiamo lo stesso id, la soluzione consiste nell’usare un metodo magico. Infatti, possiamo fare due tipi di copie, una copia superficiale shallow copy e una copia profonda deep copy. Usiamo il metodo magico __clone invocato in fase di creazione del nuovo oggetto per creare diversi id.

clone 2
clone 3

Grazie al metodo magico __clone possiamo effettuare una copia in profondità. Creiamo una nuova classe Skills.

skills
var_dump skills

Per quanto riguarda skillInstance non abbiamo due diverse proprietà, gli oggetti Skills hanno il medesimo identificativo. Abbiamo due proprietà che puntano ad uno stesso oggetto. Quindi se modifichiamo uno dei due array la modifica si rispecchierà anche nell’altro oggetto. Questa è una shallow copy se vogliamo fare una Deep copy dobbiamo risolvere i riferimenti. Questo è il codice:

skill_code
skill_instance
Copy to Clipboard

SERIALIZZARE E DESERIALIZZARE OGGETTI

La serializzazione è la trasformazione di dati complessi come oggetti e array in stringhe. Il codice seguente serializza un array.

serialize

L’array non è stato memorizzato nel file così com’è ma abbiamo il valore serializzato, cioè è stato trasformato in stringa e memorizzato nel file. Quando andiamo a leggere l’informazione esso viene deserializzato. Il processo di serializzazione può essere effettuato anche su un oggetto, utilizzando la funzione serialize. La funzione unserialize serve a deserializzare l’oggetto, cioè facendolo passare da una rappresentazione sotto forma di stringa a oggetto.Vediamo come appare l’array serializzato:

serialize

SERIALIZZARE L’OGGETTO USER

Vediamo il codice utilizzato per serializzare gli oggetti:

Copy to Clipboard
deserialize

Notiamo che gli ID sono diversi, possiamo fare una Deep copy con questa istruzione:

$user2 = unserialize(serialize($user1));

Abbiamo due oggetti diversi dopo la copia profonda, la modifica sull’uno non influirà sull’altro.

INSTANCEOF, GET_CLASS E ::CLASS

Vediamo subito il codice che utilizza queste tre istruzioni PHP.

Copy to Clipboard

CLASSI ANONIME

Da PHP 7 abbiamo anche le classi anonime. Lavoriamo in una classe anonima come facciamo in una normale classe, se facciamo un var_dump() in risposta abbiamo un oggetto di una classe anonima. Quando si utilizzano le classi anonime? L’obbligo non c’è mai diciamo quando abbiamo bisogno di un singolo oggetto in uno specifico punto dell’applicazione, invece di creare un file apposito, importarlo e creare un’istanza facciamo tutto al volo con una classe anonima. Un altro utilizzo è il simulare classi annidate, anche se non sono classi annidate così come si hanno in Java.

Copy to Clipboard

LINK AI POST PRECEDENTI

IL LINGUAGGIO PHP

LINK AL CODICE SU GITHUB

GITHUB