Разработчику. Сборник рецептов PHP
Задавайте вопросы

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

Вернуться назад

Задача

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

Решение

Для исследования объекта и получения информации о нем применяются функции 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(), по вашему выбору, может возвращать информацию, не отображая ее.

См. также

документацию по функции get_class_vars() на http://www.php.net/getclass-vars, по функции get_class_methods() на http://www.php.net/getclass-methods, по функции get_object_vars() на http://www.php.net/getobject-vars, по функции var_dump() на http://www.php.net/var-dump, по функции var_export() на http://www.php.net/var-export и по функции print_r() на http://www.php.net/print-r.

Вернуться назад

Рейтинг@Mail.ru

Яндекс.Метрика

Индекс цитирования


Рейтинг Сайтов ДОСКИ.РУ