Casting 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 😀

Non ci sono post simili.

Tags: ,

Share and Enjoy:
  • Print
  • Digg
  • del.icio.us
  • Facebook
  • Google Bookmarks
  • Diggita
  • email
  • MySpace
  • oknotizie
  • Segnalo
  • Technorati
  • Twitter
  • Upnews
  • Wikio IT
  • Add to favorites
  • StumbleUpon
  • digo
  • ziczac

Rispondi

Iscriviti Ora!!!
Scrivi un post anonimo...
  • Iscriviti al feed RSS
  • Follow us on Twitter
  • Sponsor

    Hai Voglia Di Viaggi?
Questo sito raccoglie dati statistici anonimi sulla navigazione, mediante cookie installati da terze parti autorizzate, rispettando la privacy dei tuoi dati personali e secondo le norme previste dalla legge. Continuando a navigare su questo sito, cliccando sui link al suo interno o semplicemente scrollando la pagina verso il basso, accetti il servizio e gli stessi cookie. Informazioni - Accetto