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"- 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__) # AGet 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 5.0 функция стала принимать необязательный аргумент. Ранее требовалось передавать только объект.
- Начиная с PHP 5.1.0, аргумент может быть строкой с именем класса.
- В PHP 7.2.0 улучшена обработка типов аргументов.
- В PHP 8.0.0 параметр
objectпереименован вobject_or_classдля лучшего отражения сути. Логика работы осталась прежней.
<?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
interface MyInterface {}
class Concrete implements MyInterface {}
var_dump(get_parent_class('Concrete')); // false
?>bool(false)<?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
class X {
public function check() {
return get_parent_class(); // Работает внутри метода
}
}
class Y extends X {}
$y = new Y();
echo $y->check(); // X
?>X<?php
class MyException extends RuntimeException {}
var_dump(get_parent_class('MyException'));
var_dump(get_parent_class('RuntimeException'));
?>string(13) "RuntimeException"
string(9) "Exception"