Ответ 1
class A
{
private $b = 'c';
}
$obj = new A();
$r = new ReflectionObject($obj);
$p = $r->getProperty('b');
$p->setAccessible(true); // <--- you set the property to public before you read the value
var_dump($p->getValue($obj));
Кажется, что это не работает:
$ref = new ReflectionObject($obj);
if($ref->hasProperty('privateProperty')){
print_r($ref->getProperty('privateProperty'));
}
Он попадает в цикл IF и затем выдает ошибку:
Свойство privateProperty не существует
: |
$ref = new ReflectionProperty($obj, 'privateProperty')
тоже не работает...
Страница документации содержит несколько констант, включая IS_PRIVATE
. Как я могу использовать это, если я не могу получить доступ к частной собственности lol?
class A
{
private $b = 'c';
}
$obj = new A();
$r = new ReflectionObject($obj);
$p = $r->getProperty('b');
$p->setAccessible(true); // <--- you set the property to public before you read the value
var_dump($p->getValue($obj));
getProperty
выдает исключение, а не ошибку. Значение в том, что вы можете справиться с этим и спасти себя if
:
$ref = new ReflectionObject($obj);
$propName = "myProperty";
try {
$prop = $ref->getProperty($propName);
} catch (ReflectionException $ex) {
echo "property $propName does not exist";
//or echo the exception message: echo $ex->getMessage();
}
Чтобы получить все частные свойства, используйте $ref->getProperties(ReflectionProperty::IS_PRIVATE);