Get parent class: примеры (PHP)

Функция get_parent_class в PHP: полный обзор
Раздел: Объектно-ориентированное программирование
get_parent_class(object|string $object_or_class = ?): string|false

Функция get_parent_class возвращает имя родительского класса для указанного объекта или класса. Она применяется при работе с объектно-ориентированным программированием для анализа иерархии наследования.

Назначение функции

Использование функции актуально в ситуациях, когда требуется определить, от какого класса наследуется текущий объект. Это может потребоваться для динамического определения возможностей объекта, отладки или реализации паттернов проектирования, таких как фабричные методы.

Аргументы функции

Функция принимает один необязательный аргумент:

  • object_or_class (mixed) — может быть либо экземпляром объекта (object), либо строкой с именем класса (string). В случае передачи объекта функция возвращает имя родительского класса этого объекта. При передаче строки с именем класса возвращается имя его родителя. Если аргумент опущен, функция рассматривает текущий контекст ($this) внутри метода объекта.

Если у класса нет родителя (например, он не использует ключевое слово extends), функция возвращает false.

Примеры базового использования
<?php
class A {}
class B extends A {}
class C extends B {}

$objC = new C();

// Пример 1: Передача объекта
var_dump(get_parent_class($objC)); // B

// Пример 2: Передача имени класса как строки
var_dump(get_parent_class('C'));   // B
var_dump(get_parent_class('B'));   // A
var_dump(get_parent_class('A'));   // false

// Пример 3: Вызов без аргумента внутри метода класса
class D extends C {
    public function test() {
        var_dump(get_parent_class()); // C
    }
}
(new D())->test();
?>
string(1) "B"
string(1) "B"
string(1) "A"
bool(false)
string(1) "C"
Похожие функции в PHP
  • is_subclass_of(mixed $object_or_string, string $class_name, bool $allow_string = true) — проверяет, принадлежит ли объект или класс к потомкам указанного класса. Полезно для проверки наследования без получения имени родителя.
  • class_parents(mixed $object_or_string, bool $autoload = true) — возвращает массив всех имен родительских классов, а не только ближайшего. Применяется для полного анализа иерархии.
  • get_class(object $object) — возвращает имя класса самого объекта. Часто используется совместно с get_parent_class.

Функцию get_parent_class предпочтительнее использовать, когда требуется получить именно непосредственного родителя. Для проверки принадлежности к определенной ветке наследования лучше подходит is_subclass_of, а для получения всей цепочки — class_parents.

Аналоги в других языках

Get parent class в Python

В Python используется атрибут __bases__ кортежа или метод __base__ для получения прямого родителя.

class A:
    pass
class B(A):
    pass

print(B.__base__)          # <class '__main__.A'>
print(B.__base__.__name__) # A

Get parent class в Javascript

В JavaScript для получения прототипа (аналога родительского класса) используется свойство Object.getPrototypeOf или __proto__ (устаревшее).

class A {}
class B extends A {}

console.log(Object.getPrototypeOf(B)); // [class A]
console.log(Object.getPrototypeOf(B).name); // "A"

Get parent class в MySQL

Прямого аналога в SQL нет, так как это язык запросов к базам данных, не поддерживающий наследование классов в том же смысле. Однако есть наследование таблиц в некоторых СУБД (например, PostgreSQL), но механизм отличается.

Типичные ошибки

Основная ошибка — передача несуществующего имени класса, что приводит к предупреждению и возврату false.

<?php
// Ошибка 1: Передача несуществующего класса
var_dump(get_parent_class('NonExistentClass'));
?>

Warning: get_parent_class(): Class NonExistentClass does not exist and could not be loaded in ...
bool(false)

Еще одна частая ситуация — попытка использовать функцию для класса без родителя, что возвращает false, который иногда ошибочно интерпретируют как имя класса.

<?php
class Standalone {}
$result = get_parent_class('Standalone');
if ($result === false) {
    echo 'Класс не имеет родителя';
}
?>
Класс не имеет родителя
Изменения в версиях PHP
  • В PHP 5.0 функция стала принимать необязательный аргумент. Ранее требовалось передавать только объект.
  • Начиная с PHP 5.1.0, аргумент может быть строкой с именем класса.
  • В PHP 7.2.0 улучшена обработка типов аргументов.
  • В PHP 8.0.0 параметр object переименован в object_or_class для лучшего отражения сути. Логика работы осталась прежней.
Расширенные примеры
Рекурсивное получение цепочки наследования
Пример php
<?php
class Base {}
class Middle extends Base {}
class FinalClass extends Middle {}

function get_class_lineage($class) {
    $lineage = [];
    while ($parent = get_parent_class($class)) {
        $lineage[] = $parent;
        $class = $parent;
    }
    return $lineage;
}

print_r(get_class_lineage('FinalClass'));
?>
Array
(
    [0] => Middle
    [1] => Base
)
Использование с интерфейсами

Функция не работает с интерфейсами, так как они не являются классами в иерархии наследования.

Пример php
<?php
interface MyInterface {}
class Concrete implements MyInterface {}

var_dump(get_parent_class('Concrete')); // false
?>
bool(false)
Проверка перед вызовом метода родителя
Пример php
<?php
class Animal {
    public function speak() {
        return 'Звук животного';
    }
}

class Dog extends Animal {
    public function speak() {
        if (get_parent_class($this) === 'Animal') {
            return parent::speak() . ', но гавкает';
        }
        return 'Гав!';
    }
}

$dog = new Dog();
echo $dog->speak();
?>
Звук животного, но гавкает
Динамическое определение контекста
Пример php
<?php
class X {
    public function check() {
        return get_parent_class(); // Работает внутри метода
    }
}
class Y extends X {}

$y = new Y();
echo $y->check(); // X
?>
X
Обработка встроенных классов
Пример php
<?php
class MyException extends RuntimeException {}

var_dump(get_parent_class('MyException'));
var_dump(get_parent_class('RuntimeException'));
?>
string(13) "RuntimeException"
string(9) "Exception"

PHP get_parent_class function comments

En
Get parent class Retrieves the parent class name for object or class