Для определения имени базового класса используется функция get_parent_class().
Функция принимает в качестве единственного параметра имя класса или объект и возвращает строку с именем базового класса. Рассмотрим цепочку из трёх классов «startClass -> finalClass -> PostFinal», которые наследуют друг другу. Конструктор каждого класса вызывает функцию get_parent_class(), передавая ей в качестве аргумента ссылку на текущий объект this. Пример:
class startClass {
public function __construct()
{
echo get_parent_class($this);
}
}
class finalClass extends startClass {
public function __construct()
{
echo get_parent_class($this);
}
}
class PostFinal extends finalClass {
public function __construct()
{
echo get_parent_class($this);
}
}
new startClass();
new finalClass();
new PostFinal();
Теперь при создании объектов всех трёх классов в окно браузера будут выводиться имена их базовых классов «startClass» и «finalClass».
Как можно видеть из результатов работы, для объекта первого базового класса «startClass» вызов функции get_parent_class() возвращает пустую строку. Вместо объекта функция может принимать имя класса: таким образом путём последовательных вызовов функции get_parent_class() можно восстановить цепочку предков любого объекта.
Приведём пример восстановления цепочки базовых классов для объекта класса «PostFinal»:
$postfinal = new PostFinal();
echo 'Основатель иерархии: '. get_parent_class( get_parent_class($postfinal) );
Первой функции get_parent_class() передаётся объект «$postfinal» класса «PostFinal», результатом которой является строка «finalClass». Данная строка передаётся второй функции get_parent_class(), которая возвращает для класса «finalClass» имя базового класса «startClass». Результатом работы будут следующие строки:
finalClass
Основатель иерархии: startClass
Наш пример создавался из расчёта, что вся иерархия наследования состоит из трёх классов. Когда количество классов заранее не известно, лучше прибегнуть к циклам while или do while, продолжающим вызывать функцию get_parent_class() до того времени, пока не будет достигнут самый первый базовый класс и функция не вернёт пустую строку. Пустая строка в контексте цикла равносильна значению false и вызовет его остановку.
Пример восстановления цепочки базовых классов для произвольного объекта:
$postfinal = new PostFinal();
do {
$postfinal = get_parent_class($postfinal);
echo $postfinal .'<br>';
} while ($postfinal);
Другая схожая задача - определение, является ли класс текущего объекта производным от базового. Базовый класс может содержать определённый набор методов, и для того чтобы обращаться к ним, часто следует убедиться, является ли текущий объект наследником базового класса. Для решения этой задачи используется функция is_subclass_of().
Функция принимает в качестве первого аргумента объект, а в качестве второго аргумента имя базового класса и возвращает положительный результат, если объект будет экземпляром потомка класса, и отрицательный в противном случае.
Использование функции:
$class_ = new startClass();
echo (is_subclass_of($class_, 'startClass')) ? 'True' : 'False'; # False;
$class_ = new finalClass();
echo (is_subclass_of($class_, 'startClass')) ? 'True' : 'False'; # True;
$class_ = new PostFinal();
echo (is_subclass_of($class_, 'startClass')) ? 'True' : 'False'; # True;
Функция возвращает true, только если класс, которому соответствует второй аргумент, является базовым по отношению к классу объекта первого аргумента, поэтому для объекта класса «startClass» в примере возвращается значение false.
Для того чтобы определить, является ли объект экземпляром данного класса или экземпляром классов его наследников, можно воспользоваться функцией is_a(), которая имеет синтаксис, аналогичный с функцией is_subclass_of().
Пример использования функции:
$class_ = new startClass();
echo is_a($class_, 'startClass') ? 'True' : 'False'; # True;
$class_ = new finalClass();
echo is_a($class_, 'startClass') ? 'True' : 'False'; # True;
$class_ = new PostFinal();
echo is_a($class_, 'startClass') ? 'True' : 'False'; # True;
2184