Reflection API. ReflectionClass.
Всем привет. Сегодня я пишу первую статью из серии, посвященной Reflection API.
Для начала стоит объяснить, что такое Reflection API? В переводе с английского это обозначает "Отражение" и это не просто так. Отражения позволяют нам узнать всю информацию о каком-нибудь классе, функции, методе, исключениях и прочего. Это достаточно обширная тема, и сегодня мы начнем изучать отражение класса, а потом перейдем к другим.
Отражение класса(ReflectionClass) позволяет узнать все про любой класс. Давайте рассматривать на примере.
Создайте файл user.php и наполните его следующим кодом:
<?php
namespace Users;
class User {
protected $loggedIn = false;
protected $data = [];
public function getData() {
return $this->data;
}
public function setData($data) {
$this->data = $data;
}
public function isLoggedIn() {
return $this->loggedIn;
}
}
?>
Думаю, пояснять здесь нечего. Все просто элементарно. Теперь создадим файл index.php и подключим там наш файл user.php
<?php
include 'user.php';
?>
Для того, чтобы узнать все о нашем классе, нам нужно создать объект класса ReflectionClass и передать ему в конструктор название нашего класса в виде строки.
<?php
include 'user.php';
$rc = new ReflectionClass('Users\User');
?>
Т.к. в классе используется пространство имен, не забывайте указывать его также и в конструкторе класса ReflectionClass.
Итак, у нас создан нужный нам объект. Давайте посмотрим все методы, которые он имеет.
<?php
include 'user.php';
$rc = new ReflectionClass('Users\User');
echo '<pre>';
print_r(get_class_methods($rc));
echo '</pre>';
?>
Если вы посмотрите, что выведет данный код, то увидите множество самых разных методов, которые имеет класс ReflectionClass. Давайте используем некоторые из них.
<?php
include 'user.php';
$rc = new ReflectionClass('Users\User');
echo $rc->getName();
echo '<br>';
echo $rc->getShortName();
?>
Метод getName() вернет полное имя, включая пространства имен, а метод getShortName() возвращает только имя переданного класса.
Еще один очень полезный метод данного класса - hasMethod()
<?php
include 'user.php';
$rc = new ReflectionClass('Users\User');
if($rc->hasMethod('isLoggedIn')) {
echo 'Метод существует';
}
?>
Думаю, тут все понятно. Сейчас я приведу несколько часто используемых методов.
<?php
include 'user.php';
$rc = new ReflectionClass('Users\User');
echo 'Начальная линия: '.$rc->getStartLine();
echo 'Конечная линия: '.$rc->getEndLine();
echo 'Пространство имен: '.$rc->getNamespaceName();
echo 'Методы класса: '.$rc->getMethods();
echo 'Свойства класса: '.$rc->getProperties();
?>
Это одни из самых частых методов. Но, конечно, бывают нужны и другие. К примеру, isInstance() проверяет, можно ли создать объект данного класса или нет, а метод isAbstract() проверяет, абстрактный это класс или нет и так далее. Их все вы можете посмотреть с помощью get_class_methods(), как я показал в начале статьи.
В заключении хочется показать очень полезный статический метод - export();
Т.к. метод статический, то создавать объект нам не нужно.
<?php
include 'user.php';
ReflectionClass::export('Users\User');
?>
Этот метод позволяет узнать все о классе: константы, свойства, методы и так далее.
Итак, на этом у меня все. Сегодня мы разобрались с отражением класса(ReflectionClass). Спасибо за внимание и увидимся в следующих статьях!
-
- Михаил Русаков
Комментарии (0):
Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.