RonnyKnoxville
RonnyKnoxville

Reputation: 6394

Check if something is an instance of ArrayCollection

Usually you it is possible to check whether a variable is an instance of a class by using:

$foo instanceof bar

But in the case of ArrayObjects (belonging to Symfony 2), this does not seem to work

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

yet

$foo instanceof ArrayCollection

returns false

is_array($foo) returns false and $is_object($foo) returns true

but I would like to do a specific check on this type

Upvotes: 6

Views: 7401

Answers (1)

Flosculus
Flosculus

Reputation: 6946

To perform introspection of an object under a namespace, the class still needs to be included using the use directive.

use Doctrine\Common\Collections\ArrayCollection;

if ($foo instanceof ArrayCollection) {

}

or

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

}

Regarding your attempt to determine the objects use as an array with is_array($foo).

The function will only work on the array type. However to check if it can be used as an array, you can use:

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

}

The ArrayCollection class implements both of these interfaces.

Upvotes: 16

Related Questions