Войти Регистрация

Для определения имени базового класса используется функция 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;

Комментировать

captcha

Вход

Зарегистрируйтесь, если нет учетной записи

Восстановить пароль
Регистрация
Восстановить пароль
Войти в личный кабинет