OOP IN PHP QUARTA PARTE
LE KEYWORD $THIS, SELF, PARENT E STATIC
Inizialmente 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 AI METODI CON LE KEYWORD PARENT E SELF
Nella figura a fianco è riportato un esempio su come usare le keyword parent e self.
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.
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).
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);
CREAZIONE CLASSE USER
Creiamo una classe User in questo modo, sotto viene riportato anche il 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.
Se modifichiamo la proprietà nome tramite $user2 avremo:
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.
Grazie al metodo magico __clone possiamo effettuare una copia in profondità. Creiamo una nuova classe 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:
SERIALIZZARE E DESERIALIZZARE OGGETTI
La serializzazione è la trasformazione di dati complessi come oggetti e array in stringhe. Il codice seguente serializza un array.
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:
SERIALIZZARE L’OGGETTO USER
Vediamo il codice utilizzato per serializzare gli oggetti:
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.
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.
Lascia un commento