- Обычные функции PHP;
- Reflection API
Используем обычные функции PHP.
Например можно просмотреть значения всех свойств объекта на текущий момент или проверить содержит ли данный класс определенный метод... Для этого PHP содержит вспомогательные функции:- get_object_vars( $obj ) - возвращает ассоциативный массив всех свойств объекта $obj, вместе с их текущими значениями;
- get_class_vars( $className ) - возвращает ассоциативный массив всех полей класса $className вместе с их значениями по умолчанию;
- get_class_methods($className или $obj ) - возвращает массив названий всех методов класса.
Я, для себя, написал функцию, которая выводит публичные свойства и методы на экран в удобном виде. В качестве параметра $ess, она принимает объект или класс, который нас интересует:
function InfoEssence($ess) { //Передан объект if(is_object($ess)){ $class = get_class($ess); //класс объекта $obj = $ess; $vars_obj = '<pre>' . print_r(get_object_vars($obj), true) . '</pre>'; //Передан класс } else { $class = $ess; $vars_obj = null; } $vars_class = '<pre>' . print_r(get_class_vars($class), true) . '</pre>'; $methods = '<pre>' . print_r(get_class_methods($class), true) . '</pre>'; if ($vars_obj) echo 'Свойства объекта- экземпляра класса '.$class.':'.$vars_obj; echo 'Свойства класса '.$class.':'.$vars_class. 'Методы класса '.$class.':'.$methods; }
Проверим ее на примере простого класса MyClass и его экземпляра (объекта) $objMyClass:
class MyClass{ static public $name = "Serj"; public $age = 21; function getAge() {} function setAge() {} } $objMyClass = new MyClass(); $objMyClass->age = 30;
Если у вас есть экземпляр класса (объект), то проще всего именно его и передать в функцию. Так дополнительно получим информацию по его свойствам.
Попробуем получить информацию в контексте объекта:
InfoEssence($objMyClass); //информация по объектуРезультат:
Свойства объекта- экземпляра класса MyClass: Array ( [age] => 30 ) Свойства класса MyClass: Array ( [age] => 21 [name] => Serj ) Методы класса MyClass: Array ( [0] => getAge [1] => setAge )
Если объект не создавался или же нет к нему доступа - получаем информацию в контексте класса, для чего передаем его название:
InfoEssence('MyClass'); //информация по классу // или InfoEssence(MyClass::class);Результат:
Свойства класса MyClass: Array ( [age] => 21 [name] => Serj ) Методы класса MyClass: Array ( [0] => getAge [1] => setAge )
Эту функцию можно так же использовать для получения информации изнутри любого другого класса.
Для этого:
1. функцию InfoEssence() сделать методом данного класса (разместить ее среди других методов);
2. для запуска - добавить в любой исполняемый метод:
- если интересует текущий класс(объект)
- если интересует другой класс(объект), например «Post»
Reflection API.
С помощью классов, которые содержит Reflection API, можно сделать очень многое, не только вывести на экран информацию про свойства и методы класса/объекта. Не требует установки т.к. является частью ядра PHP. Включен с 5-й версии.Reflection | Содержит статический метод export(), предоставляющий итоговую информацию о классе |
ReflectionClass | Позволяет получить информацию о классе и содержит средства для работы с ним |
ReflectionMethod | Позволяет получить информацию о методах класса и содержит средства для работы с ними |
ReflectionParameter | Позволяет получить информацию об аргументах метода |
ReflectionProperty | Позволяет получить информацию о свойствах класса |
ReflectionFunction | Позволяет получить информацию о функциях и содержит средства для работы с ними |
ReflectionExtension | Позволяет получить информацию о расширениях PHP |
ReflectionException | Предназначен для обработки ошибок |
Остановимся только на некоторых моментах. У ReflectionClass есть статичный метод export(), который выводит на экран много полезной информации по переданному ему классу. Немного похоже на то, что делает вышеописанная функция, но выводит не только публичные, а все свойства и методы!
Выведем информацию по вышеописанному классу:
echo '<pre>'; ReflectionClass::export('MyClass'); echo '</pre>';в качестве параметра, методу export() передаем название класса или переменную содержащую нужный объект.
Получим:
Class [ <user> class MyClass ] { @@ W:\domains\test.loc\index.php 14-19 - Constants [0] { } - Static properties [1] { Property [ public static $name ] } - Static methods [0] { } - Properties [1] { Property [ <default> public $age ] } - Methods [2] { Method [ <user> public method getAge ] { @@ W:\domains\test.loc\index.php 17 - 17 } Method [ <user> public method setAge ] { @@ W:\domains\test.loc\index.php 18 - 18 } } }</user></user></default></user>так же получим информацию про файл в котором находится данный класс и строки на которых он расположен. Чего не хватает по сравнению с функцией описанной выше так это вывода значений свойств класса. Но их можно получить отдельно - читайте документацию.
Отмечу еще, что иногда проще взглянуть на сам класс в файле, а не выводить по нему информацию. Правда не всегда понятно, в каком именно файле его искать. Вывести только название и путь к файлу в котором объявлен класс можно так:
$rc = new ReflectionClass ('MyClass'); //или $obj echo $rc->getFileName(); //W:\domains\test.loc\index.php