Обнаружение методов и свойств объекта

Задача
Необходимо просмотреть объект, чтобы определить, какие методы и свойства у него есть, что позволяет написать код, работающий с любыми родовыми объектами независимо от типа.

Решение
Для исследования объекта и получения информации о нем применяются функции get_class_methods() и get_class_vars():

// изучаем машины
$car_methods = get_class_methods('car');
$car_vars = get_class_vars('car');
// действуем на основании полученных знаний
if (in_array('speed_away', $car_methods)) {
$getaway_van = new car;
$getaway_van->speed_away();
}

Обсуждение
Редко бывает, когда есть объект, но невозможно исследовать его фактический исходный код, чтобы разобраться в его работе. Все же эти функции могут оказаться полезными для проектов, в которых необходимо применить целый ряд различных классов, таких как автоматическое создание документации по классам, отладчиков родовых объектов и хранителей состояний, подобных функции serialize().

И функция get_class_methods(), и функция get_class_vars() возвращают массив значений. В функции get_class_methods() ключи – это числа, а значения – это имена методов.


В случае функции get_class_vars() возвращаются и имена переменных, и значения по умолчанию (при-
своенные с помощью конструкции var), при этом имена переменных возвращаются как ключи, а значения по умолчанию, если таковые есть, – как значения.

Другая полезная функция – это get_object_vars(). В отличие от своей сестры, функции get_class_vars(), функция get_object_vars() возвращает информацию о переменных конкретного экземпляра объекта, а не предка вновь созданного объекта.

Поэтому с ее помощью можно проверить статус объекта, то есть его текущее состояние в программе:

$clunker = new car;
$clunker_vars = get_object_vars($clunker); // мы передаем объект, а не класс

Нам нужна информация о конкретном объекте, поэтому передается объект, а не имя его класса. Но функция get_object_vars() возвращает информацию в том же формате, что и функция get_class_vars().

Это позволяет без труда написать короткий сценарий, чтобы посмотреть, как добавляются переменные класса:

$new_vars = array_diff(array_keys(get_object_vars($clunker)),
array_keys(get_class_vars('car')));

Сначала при помощи функции array_keys() извлекаем имена переменных.


Затем, вызвав функцию array_diff(), определяем, какие из переменных объекта $clunker не определены в классе car.

Если вам достаточно лишь взглянуть на экземпляр объекта, и вы не хотите разбираться с функцией get_class_vars(), то для печати значений объекта обратитесь либо к функциям var_dump(), var_export(), либо к функции print_r(). Каждая из них выводит информацию на печать немного по-разному; функция var_export(), по вашему выбору, может возвращать информацию, не отображая ее.

Оцените статью: (0 голосов)
0 5 0

Статьи из раздела PHP на эту тему:
Динамическая реализация объекта
Динамическое создание класса
Добавление свойств в базовый объект
Доступ к переопределенным методам
Клонирование объектов

Вернуться в раздел: PHP / 7. Классы и объекты