Получаем информацию о классе при помощи Reflection Api в PHP
lang_of_article_differ
want_proper_trans
Сегодня я собираюсь показать вам, как вы можете получить всю возможную информацию о классе в php, используя Reflection Api.
Сначала давайте создадим класс, который мы будем анализировать. Это сделано с целью показать вам особенности отражения.
class Person {
const NAME_LENGTH_MAX = 50;
protected $name;
public function __construct($name){
$this->name = $name;
}
/**
* @return string
*/
public function getName(){
return $this->getName();
}
public static function generateName() {
$characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
$charactersLength = strlen($characters);
$name = '';
for ($i = 0; $i < self::NAME_LENGTH_MAX; $i++) {
$name .= $characters[rand(0, $charactersLength - 1)];
}
return $name;
}
}
Что можно сказать о классе Person
? У него нет родительских классов (он не расширяет ни один класс). Он имеет одну константу, одно защищенное свойство, две функции и один конструктор. - Верно. Мы смогли получить всю эту информацию программным способом. Рассмотрим следующий скрипт:
function echoInfoOnClass($object) {
$reflectionClass = new \ReflectionClass($object);
echo "Name: " . $reflectionClass->getName() . PHP_EOL; // echo class name (with namespace if any)
echo "Short name: " . $reflectionClass->getShortName() . PHP_EOL; // echo class name without namespace
// show all methods
echo PHP_EOL;
echo "Constants:" . PHP_EOL . PHP_EOL;
foreach ($reflectionClass->getConstants() as $constantName => $constant) {
echo $constantName . ' = ' . $constant . PHP_EOL;
}
echo PHP_EOL;
echo "Properties:" . PHP_EOL . PHP_EOL;
foreach ($reflectionClass->getProperties() as $property) {
$propModifiers = \Reflection::getModifierNames($property->getModifiers()); // list of method modifiers (public,static, ..)
foreach ($propModifiers as $modifier) { // echo all modifiers with space
echo $modifier . " ";
}
$property->setAccessible(true); // this method of ReflectionProperty class make possible to access private or protected data on classes
echo $property->getName() . ' = ' . json_encode($property->getValue($object)) . PHP_EOL;
}
echo PHP_EOL;
echo "Methods:" . PHP_EOL . PHP_EOL;
foreach ($reflectionClass->getMethods() as $method) {
$methodModifiers = \Reflection::getModifierNames($method->getModifiers()); // list of method modifiers (public,static, ..)
foreach ($methodModifiers as $modifier) { // echo all modifiers with space
echo $modifier . " ";
}
echo $method->getName();
$params = [];
foreach ($method->getParameters() as $methodParam) {
$currentParam = $methodParam->getName();
if ($methodParam->isDefaultValueAvailable()) {
$currentParam .= '=' . $methodParam->getDefaultValue();
if ($methodParam->isDefaultValueConstant()) {
$currentParam .= '(' . $methodParam->getDefaultValueConstantName() . ')';
}
}
$params[] = $currentParam;
}
// glue together pairs paramname - defaultvalue if any
echo '(' . implode(',', $params) . ')';
echo PHP_EOL;
}
}
Если мы запустим следующий код
echoInfoOnClass(new Person('Serhiy'));
мы получим следующий вывод
Name: App\Controllers\Person
Short name: Person
Constants:
NAME_LENGTH_MAX = 50
Properties:
protected name = "Serhiy"
Methods:
public __construct(name)
public getName()
public static generateName(length=50(self::NAME_LENGTH_MAX))
Как мы видим, мы собрали всю информацию о свойствах класса, константах и полях, включая видимость (public
илиprotected
или private
), является ли онаstatic
или нет, и даже значения свойств. Вы можете использовать мою функцию echoInfoOnClass
в своих программах, если хотите.
Очень полезно понять, как мы получаем такой результат, читая код функции построчно.