martedì, Dicembre 3, 2024
HomeProgrammazioneCasting di un oggetto in PHP

Casting di un oggetto in PHP

Oggi vediamo come fare il casting (conversione) di un oggetto dall’stdObject in un oggetto di tipo diverso, il problema è sorto mentre stavo lavorando a un sistema di cache, questo sistema salvava un oggetto su un file in formato json (il serialize sarebbe stato lo stesso), quando con la funzione json_decode si ritira l’oggetto, questo oggetto è di tipo stdObject, ossia un oggetto con tutti i dati salvati ma senza metodi dell’oggetto originario, quindi se vogliamo usare metodi di quell’oggetto sarà necessario convertirlo nell’oggetto originale, ecco come risolvere il problema, grazie alle classi reflection…

Utilizzando la libreria per il Reflection* (necessita di php 5.3 o superiore) andremo a creare una funzione che si occupa di esaminare il codice della oggetto di destinazione e di copiare all’interno i valori, effettuando un vero e proprio casting di oggetto rimettendo apposto anche lo scope delle proprietà dell’oggetto originale


/**
 * Class casting
 *
 * @param string|object $destination
 * @param object $sourceObject
 * @return object
 */
function cast($destination, $sourceObject)
{
    if (is_string($destination)) {
        $destination = new $destination();
    }
    $sourceReflection = new ReflectionObject($sourceObject);
    $destinationReflection = new ReflectionObject($destination);
    $sourceProperties = $sourceReflection->getProperties();
    foreach ($sourceProperties as $sourceProperty) {
        $sourceProperty->setAccessible(true);
        $name = $sourceProperty->getName();
        $value = $sourceProperty->getValue($sourceObject);
        if ($destinationReflection->hasProperty($name)) {
            $propDest = $destinationReflection->getProperty($name);
            $propDest->setAccessible(true);
            $propDest->setValue($destination,$value);
        } else {
            $destination->$name = $value;
        }
    }
    return $destination;
}

Questa funzione l’ho trovata in rete ma in effetti non è nulla di complicato, in parole povere crea 2 oggetti di tipo ReflectionObject, prende tutte le proprietà dell’oggetto sorgente e le scorre tutte rendendole tutte accessibili per poter copiarne il contenuto durante il ciclo cerca le proprietà e le copia in quello di destinazione e infine restituisce l’oggetto convertito, come già scritto è abbastanza semplice se non trova una proprietà settata la crea con un assegnazione banale.

L’uso è ancora più banale:


class casa{
	public $valore;
	public $nazione;
	public $metriquadri;
	function __construct(){
	}
	
	function calcValore(){
		//in base alla nazione moltiplico i metri quadri per il valore al metroquadro
		switch($this->nazione){
			case 'Italia':
				$this->valore = $this->metriquadri * 3000
			break;
			case 'Inghilterra':
				$this->valore = $this->metriquadri * 6000  
			break;
		
		}
	}
	
}


$casa = new casa();
$casa->metriquadri = '110';
$casa->nazione = 'Italia';

$json = json_encode($casa);
//salvo json da qualche parte, nel nostro caso d'esempio è totalemnte inutile :P

$objCasa = json_decode($json); //ripristino oggetto
/*a questo punto se proviamo a usare il metodo calcValore su objCasa ci darà un errore di "call undefined method" perchè appunto stiamo lavorando con un oggetto di tipo stdObject quindi senza alcuna funzione*/

//Facciamo il casting quindi...

$objCasa = cast('casa',objCasa);
$objCasa->calcValore();

echo 'Il valore della casa è: ' . objCasa->valore;

*Reflection: libreria di classi aggiunte in PHP 5.3 utili per l’introspezione del codice a runtime, in parole povere possiamo analizzare il codice di una funzione, un oggetto o un costrutto a runtime, vediamo la funzione che ci permette di fare questo…

Spero di essere stato abbastanza chiaro ho cercato di semplificare al massimo quello che c’era da capire 😀

BisonTech.net partecipa al Programma Affiliazione Amazon EU, e ad altri programmi di affiliazione che consente al sito di percepire una commissione pubblicitaria fornendo link di affiliazione su amazon e altri partner.

Stefano
Stefano
Sono un tech enthusiast, appassionato di programmazione, marketing e videogames. Adoro sperimentare tutto ciò che la tecnologia ha da offrire. Lavoro con la tecnologia da oltre 20 anni.

LASCIA UN COMMENTO

Per favore inserisci il tuo commento!
Per favore inserisci il tuo nome qui

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.

ULTIMI POST

POPOLARI

SMANETTONI