Получить предков объекта PHP в дереве наследования - PullRequest
4 голосов
/ 12 апреля 2011

У меня есть объект, и я хочу перечислить все родительские классы вплоть до stdClass или любого другого.

Я добавил полиморфное поле в свою таблицу базы данных (скажем, категории) и хочу автоматизировать мой метод поиска, чтобы супер-классы также возвращались, таким образом я могу перейти в дерево наследования в точке, которую я не обязательно знаю, в финал подкласс:

FoodCategory::find_by_id(10) === Category::find_by_id(10)

SELECT * FROM categories WHERE ..... AND type IN ('FoodCategory', 'Category');

Примерно я думаю:

function get_class_lineage($object){
    $class = get_parent_class($object);
    $lineage = array();
    while($class != 'stdClass'){
        $dummy_object = new $class();
        $lineage[] = $class = get_parent_class($dummy_object);
    }

    return $lineage;
}

Но это создает объект, кто-нибудь знает, как этого достичь без?

Спасибо за любой вклад, я чувствую, что здесь что-то упущено.

Ответы [ 3 ]

10 голосов
/ 12 апреля 2011

Использование Reflection

$class = new ReflectionClass($object);

$lineage = array();

while ($class = $class->getParentClass()) {
    $lineage[] = $class->getName();
}

echo "Lineage: " . implode(", ", $lineage);

ReflectionClass принимает имя класса или объекта.

8 голосов
/ 13 апреля 2011

После указания на повторяющийся вопрос, на который я пошел:

function get_class_lineage($object){
    $class_name = get_class($object);
    $parents = array_values(class_parents($class_name));
    return array_merge(array($class_name), $parents);
}

Функция class_parents из стандартной библиотеки была очевидной вещью, которую я пропустил.

Я думал, что Reflection был излишним для этой простой задачи.

2 голосов
/ 12 апреля 2011

Как вы можете прочитать в руководстве , вы также можете указать имя класса в виде строки для функции.

$class = get_class($this);
$lineage = array();
do {
  $lineage[] = $class;
  $class = get_parent_class($class);
} while ($class != 'stdClass');

Здесь индекс 0 - это имя класса самого объекта:

...