2010-09-20 32 views
17

C'è un modo per dire a PHP come convertire i tuoi oggetti in ints? L'ideale sarebbe simileEsiste un numero intero equivalente di __toString()

class ExampleClass 
{ 
    ... 

    public function __toString() 
    { 
     return $this->getName(); 
    } 

    public function __toInt() 
    { 
     return $this->getId(); 
    } 
} 

mi rendo conto che non è supportato in questa forma esatta, ma c'è un facile (non-così-hacky) soluzione?

---------------------- MODIFICA MODIFICA MODIFICA --------------------- --------

Grazie a tutti! La ragione principale per cui mi sto occupando di questo è che vorrei creare alcune classi (generatori di moduli, classi di menu, ecc.) Che usano oggetti invece di array (uniqueId => description). Questo è abbastanza facile se si decide che dovrebbero funzionare solo con quegli oggetti, o solo con oggetti che estendono una sorta di superclasse di oggetti generici.

Ma sto cercando di capire se c'è una via di mezzo: idealmente le mie classi di framework possono accettare coppie di stringhe di interi o oggetti con metodi getId() e getDescription(). Perché questo è qualcosa che deve essere accaduto a qualcun altro prima che mi piacerebbe utilizzare la conoscenza combinata di StackOverflow per scoprire se c'è un modo standard/best-practice per fare questo che non si scontri con la libreria standard di php, quadri comuni ecc..

+0

io non sono sicuro di come PHP saprebbe la differenza ? __toString() viene utilizzato quando un oggetto viene emesso direttamente, non solo typecast. –

+0

Si potrebbe fare una classe "Object", come in Java, e avere tutto ciò che ne deriva, quindi implementare un metodo sovrascrivibile. – Raveline

+0

@Phil Fortunatamente sto usando 5.3 quindi non ho più quel problema :) http://php.net/manual/en/language.oop5.magic.php#language.oop5.magic.tostring –

risposta

7

Ho paura che non ci sia niente del genere. Non sono esattamente sicuro di quale sia la ragione per cui ti serve, ma considera le seguenti opzioni:

Aggiunta di un metodo toInt(), casting nella classe. Probabilmente ne sei già a conoscenza.

public function toInt() 
{ 
    return (int) $this->__toString(); 
} 

Il doppio casting all'esterno della classe, si tradurrà in un int.

$int = (int) (string) $class; 

Fai una funzione speciale al di fuori della classe:

function intify($class) 
{ 
    return (int) (string) $class; 
} 
$int = intify($class); 

Naturalmente il metodo __toString() può restituire una stringa con un numero in esso: return '123'. L'utilizzo al di fuori della classe potrebbe eseguire il cast automatico di questa stringa su un numero intero.

+0

Grazie! La ragione per cui sto esaminando questo è che vorrei fare alcune classi (generatori di moduli, classi di menu, ecc.) Utilizzare oggetti invece di array (uniqueId => description) ma senza adattarli specificatamente a tali oggetti (perdita di generalità) o senza introdurre una classe Object globale (perdita di generalità + un sacco di codice che deve essere adattato). Spero ci sia una qualche soluzione intermedia da trovare. –

+2

Ecco dove sono le interfacce, giusto? spl_object_hash() restituisce un ID univoco per ogni oggetto. Bella domanda, però. – user228395

+0

Dolce! Ma quegli ID cambieranno da richiesta a richiesta, no? –

0

__toString() esiste come metodo magico.

http://www.php.net/manual/en/language.oop5.magic.php#language.oop5.magic.tostring

__toInt() non lo fa.

+0

Penso che tu abbia letto male la domanda;) * Esiste un ** integer equivalent ** di '__toString() '* –

+0

@Felix, l'ho mal interpretato e ho modificato la mia risposta pochi secondi prima che tu rispondessi :) Grazie però. – Fanis

+1

Grazie per il tuo tempo! So che __toInt() non esiste, è per questo che sto chiedendo una soluzione. –

1

Fai in modo che gli oggetti implementino ArrayAccess e Iterator.

class myObj implements ArrayAccess, Iterator 
{ 
} 

$thing = new myObj(); 
$thing[$id] = $name; 

Poi, nel codice che consuma questi dati, è possibile utilizzare lo stesso codice di allineamento "vecchio stile" che si aveva prima:

// Here, $thing can be either an array or an instance of myObj 
function doSomething($thing) { 
    foreach ($thing as $id => $name) { 
     // .... 
    } 
} 
Problemi correlati