Класс ReflectionProperty
(PHP 5, PHP 7)
Введение
Класс ReflectionProperty сообщает информацию о свойствах класса.
Обзор классов
Свойства
- name
-
Имя свойства. Доступно только для чтения и выбрасывает исключение ReflectionException при попытке записи.
- class
-
Имя класса, в котором данное свойство описано. Доступно только для чтения и выбрасывает исключение ReflectionException при попытке записи.
Предопределенные константы
Модификаторы ReflectionProperty
ReflectionProperty::IS_STATIC
-
Указывает, что свойство является статическим (static).
ReflectionProperty::IS_PUBLIC
-
Указывает, что свойство является общедоступным (public) properties.
ReflectionProperty::IS_PROTECTED
-
Указывает, что свойство является защищенным (protected).
ReflectionProperty::IS_PRIVATE
-
Указывает, что свойство является закрытым (private).
Содержание
- ReflectionProperty::__clone — Копирующий конструктор
- ReflectionProperty::__construct — Конструктор класса ReflectionProperty
- ReflectionProperty::export — Экспорт
- ReflectionProperty::getDeclaringClass — Получение объявляющего класса
- ReflectionProperty::getDocComment — Получение документируемого комментария
- ReflectionProperty::getModifiers — Получение модификаторов
- ReflectionProperty::getName — Получение имени свойства
- ReflectionProperty::getValue — Получение значения
- ReflectionProperty::isDefault — Проверяет, является ли значение свойством по умолчанию
- ReflectionProperty::isPrivate — Проверяет, является ли свойство частным (private)
- ReflectionProperty::isProtected — Проверяет, является ли свойство защищенным (protected)
- ReflectionProperty::isPublic — Проверяет, является ли свойство общедоступным (public)
- ReflectionProperty::isStatic — Проверка, является ли свойство статическим
- ReflectionProperty::setAccessible — Задание доступности свойства
- ReflectionProperty::setValue — Задание значения свойству
- ReflectionProperty::__toString — Преобразование в строку
- PHP Руководство
- Функции по категориям
- Индекс функций
- Справочник функций
- Расширения, относящиеся к переменным и типам
- Введение
- Установка и настройка
- Предопределенные константы
- Примеры
- Расширение
- Класс Reflection
- Класс ReflectionClass
- Класс ReflectionZendExtension
- Класс ReflectionExtension
- Класс ReflectionFunction
- Класс ReflectionFunctionAbstract
- Класс ReflectionMethod
- Класс ReflectionObject
- Класс ReflectionParameter
- Класс ReflectionProperty
- ReflectionType
- ReflectionGenerator
- Интерфейс Reflector
- Класс ReflectionException
Коментарии
I think a more accurate explanation is this:
The Reflection classes are designed to reflect upon the source code of an application, not on any runtime information.
I think you misunderstand the ReflectionProperty constructor in your example above. The fact that it accepts an object as argument is just a convenience feature - you are actually inspecting the class of that object, not the object itself, so it's basically equivalent to:
<?php
// works fine
$Reflection = new ReflectionProperty(get_class($a), 'a');
// throws exception
$Reflection = new ReflectionProperty(get_class($a), 'foo');
?>
Getting the class of the object you're passing in is implied, since inspecting a defined property is the purpose of this class.
In your example, $a->foo is a dynamic member - it is not defined as a member of class, so there is no defining class reference, line number, default value, etc. - which means, there is nothing to reflect upon.
Clearly this very useful library could use some real documentation...
There is way to get property type without reflection.
Not very clear, but there is:
<?php
function getPropType(object $object, string $propName): string
{
try {
$object->{$propName} = new class {};
} catch (\TypeError $e) {
// @hint: question mark in type can be used to detect if property is nullable
if (preg_match('/of type \??(.*)$/', $e->getMessage(), $m)) {
return $m[1];
}
throw $e;
} catch (\Error $e) {
// property doesn't exist or is not public
throw $e;
}
throw new \TypeError(sprintf('Property %s of class %s has no type', $propName, $object::class));
// alternatively return 'mixed';
}
?>
note: in case you need access to private/protected properties its easy to change this to be embedded in any class:
<?php
trait PropertyTypeResolver
{
public function getPropType(string $propName): string
{
try {
$this->{$propName} = new class {};
} catch (\TypeError $e) {
// @hint: question mark in type can be used to detect if property is nullable
if (preg_match('/of type \??(.*)$/', $e->getMessage(), $m)) {
return $m[1];
}
throw $e;
} catch (\Error $e) {
// property doesn't exist
throw $e;
}
throw new \TypeError(sprintf('Property %s of class %s has no type', $propName, $this::class));
// alternatively return 'mixed';
}
}
?>