2014-11-13 9 views
5

Zwykle możliwe jest, aby sprawdzić, czy zmienna jest instancją klasy za pomocą:Sprawdź, czy coś jest instancją ArrayCollection

$foo instanceof bar 

Ale w przypadku ArrayObjects (należącego do Symfony 2) to nie wydają się działać

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

jeszcze

$foo instanceof ArrayCollection 

zwraca false

is_array($foo) powraca false i $is_object($foo) powraca true

ale chciałbym zrobić konkretny czek na tego typu

+0

Czy używasz tego w formularzu? –

+0

Tak używam tego w konstruktorze formularzy – JackalopeZero

Odpowiedz

12

Aby wykonać introspekcji obiektu pod nazw, klasa musi jeszcze do uwzględnienia przy użyciu dyrektywy use.

use Doctrine\Common\Collections\ArrayCollection; 

if ($foo instanceof ArrayCollection) { 

} 

lub

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

} 

Odnośnie swojej próbie określenia obiekty używać jako tablicę z is_array($foo). Ta funkcja działa tylko na typie array. Jednak, aby sprawdzić, czy może on być stosowany w postaci tablicy, można użyć:

/* 
* 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)) { 

} 

Klasa ArrayCollection implementuje oba te interfejsy.