2014-11-13 6 views
5

Di solito si si può verificare se una variabile è un'istanza di una classe utilizzando:Verificare se qualcosa è un'istanza di ArrayCollection

$foo instanceof bar 

Ma nel caso di ArrayObjects (appartenenti a Symfony 2), questo non sembra funzionare

get_class($foo) rendimenti 'Doctrine\Common\Collections\ArrayCollection'

ancora

$foo instanceof ArrayCollection 

restituisce false

is_array($foo) rendimenti false e $is_object($foo) rendimenti true

ma vorrei fare un controllo specifico su questo tipo

+0

Si sta utilizzando questo con un modulo? –

+0

Sì Sto usando questo in un generatore di moduli – JackalopeZero

risposta

12

Per eseguire l'introspezione di un oggetto in uno spazio dei nomi, la classe ha ancora bisogno da includere utilizzando la direttiva use.

use Doctrine\Common\Collections\ArrayCollection; 

if ($foo instanceof ArrayCollection) { 

} 

o

if ($foo instanceof \Doctrine\Common\Collections\ArrayCollection) { 

} 

quanto riguarda il tuo tentativo di determinare gli oggetti usano come un array con is_array($foo).

La funzione funziona solo con il tipo array. Tuttavia per verificare se può essere usato come un array, è possibile utilizzare:

/* 
* If you need to access elements of the array by index or association 
*/ 
if (is_array($foo) || $foo instanceof \ArrayAccess) { 

} 

/* 
* If you intend to loop over the array 
*/ 
if (is_array($foo) || $foo instanceof \Traversable) { 

} 

/* 
* For both of the above to access by index and iterate 
*/ 
if (is_array($foo) || ($foo instanceof \ArrayAccess && $foo instanceof \Traversable)) { 

} 

La classe ArrayCollection implementa entrambe le interfacce.