Вот возможное решение:
function get_instances_of_class($class) {
$instances = array();
foreach ($GLOBALS as $value) {
if (is_a($value, $class) || is_subclass_of($value, $class)) {
array_push($instances, $value);
}
}
return $instances;
}
Редактировать : Обновлен код, чтобы проверить, является ли $class
суперклассом.
Редактировать 2 : Сделал немного более сложную рекурсивную функцию, которая проверяет переменные каждого объекта вместо только объектов верхнего уровня:
function get_instances_of_class($class, $vars=null) {
if ($vars == null) {
$vars = $GLOBALS;
}
$instances = array();
foreach ($vars as $value) {
if (is_a($value, $class)) {
array_push($instances, $value);
}
$object_vars = get_object_vars($value);
if ($object_vars) {
$instances = array_merge($instances, get_instances_of_class($class, $object_vars));
}
}
return $instances;
}
Я не уверен, что это может привести к бесконечной рекурсии с определенными объектами, так что будьте осторожны ...