At example #2: the comment // int(2) is stated while the value for the private property is actually 3. (private $z = 3;)
var_dump($prop->getValue($obj)); // This should be int(3)
(PHP 5, PHP 7, PHP 8)
ReflectionProperty::__construct — Создаёт объект класса ReflectionProperty
class
Строка, которая содержит имя класса для отражения, или объект.
property
Имя свойства, которое требуется отразить.
Метод выбросит исключение при попытке получить или установить значение защищённого или закрытого свойства класса.
Пример #1 Пример использования метода ReflectionProperty::__construct()
<?php
class Str
{
public $length = 5;
}
// Создаём новый объект класса ReflectionProperty
$prop = new ReflectionProperty('Str', 'length');
// Выводим основную информацию об объекте
printf(
"===> У%s%s%s%s свойство '%s' (которое %s)\n" .
" есть модификаторы %s\n",
$prop->isPublic() ? ' открытого' : '',
$prop->isPrivate() ? ' закрытого' : '',
$prop->isProtected() ? ' защищённого' : '',
$prop->isStatic() ? ' статического' : '',
$prop->getName(),
$prop->isDefault() ? 'объявили во время компиляции' : 'создали во время исполнения кода',
var_export(Reflection::getModifierNames($prop->getModifiers()), true)
);
// Содаём экземпляр класса Str
$obj= new Str();
// Поучаем текущее значение
printf("---> Значение: ");
var_dump($prop->getValue($obj));
// Изменяем значение
$prop->setValue($obj, 10);
printf("---> Установка значения 10, новое значение: ");
var_dump($prop->getValue($obj));
// Сбрасываем объект
var_dump($obj);
?>
Вывод приведённого примера будет похож на:
===> У открытого свойства 'length' (которое объявили во время компиляции) есть модификаторы array ( 0 => 'public', ) ---> Значение: int(5) ---> Установка значения 10, новое значение: int(10) object(Str)#2 (1) { ["length"]=> int(10) }
Пример #2 Получение значений защищённых и закрытых свойств через класс ReflectionProperty
<?php
class Foo
{
public $x = 1;
protected $y = 2;
private $z = 3;
}
$obj = new Foo;
$prop = new ReflectionProperty('Foo', 'y');
$prop->setAccessible(true);
var_dump($prop->getValue($obj)); // int(2)
$prop = new ReflectionProperty('Foo', 'z');
$prop->setAccessible(true);
var_dump($prop->getValue($obj)); // int(2)
?>
Вывод приведённого примера будет похож на:
int(2) int(3)
At example #2: the comment // int(2) is stated while the value for the private property is actually 3. (private $z = 3;)
var_dump($prop->getValue($obj)); // This should be int(3)