PHPCon Poland 2024

ReflectionProperty::setAccessible

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

ReflectionProperty::setAccessibleУстанавливает доступность свойства

Описание

public ReflectionProperty::setAccessible(bool $accessible): void

Метод открывает доступ к защищённому или закрытому свойству методам ReflectionProperty::getValue() и ReflectionProperty::setValue().

Замечание: С PHP 8.1.0 вызов метода утратил смысл; свойства доступны по умолчанию.

Список параметров

accessible

Значение true делает свойство доступным, false — закрывает доступ к свойству.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Примеры

Пример #1 Определение простого класса

<?php

class MyClass
{
private
$foo = 'bar';
}

$property = new ReflectionProperty("MyClass", "foo");
$property->setAccessible(true);

$obj = new MyClass();
echo
$property->getValue($obj);
echo
$obj->foo;

?>

Вывод приведённого примера будет похож на:

bar
Fatal error: Uncaught Error: Cannot access private property MyClass::$foo in /in/WJqTv:12

Смотрите также

add a note

User Contributed Notes 3 notes

up
41
matthieu at mnapoli dot fr
11 years ago
Note that the property will only become accessible using the ReflectionProperty class. The property is still private or protected in the class instances.

<?php
class MyClass {
private
$myProperty = true;
}

$class = new ReflectionClass("MyClass");
$property = $class->getProperty("myProperty");
$property->setAccessible(true);

$obj = new MyClass();
echo
$property->getValue($obj); // Works
echo $obj->myProperty; // Doesn't work (error)
?>
up
4
Rob McVey
14 years ago
If you are using < PHP 5.3 and need to get the private attributes and values, you can use this method:

This is what you are doing:

<?php
$obj_with_privates
= new MyObject();
$class = get_class($obj_with_privates);
$vars = get_object_vars($obj_with_privates);
//will not show private attributes
print_r($vars);

$reflection = new ReflectionClass( $class );
$attributes = $reflection->getProperties();
//still no private access!
print_r($attributes);
?>

This is what you should do:

<?php
$obj_with_privates
= new MyObject();

$class = get_class( $obj_with_privates );
$reflection = new ReflectionClass( $class );
$abstract = $reflection->getMethods( ReflectionMethod::IS_ABSTRACT );
$priv_attr = $reflection->getProperties( ReflectionProperty::IS_PRIVATE );
$privates = array();
$parent = get_parent_class( $class );
$child = $class;
$constructor = $reflection->getConstructor();

//If the class has abstract methods you need to implement them
$abstr_methods = "";
if(
sizeof($abstr_methods))
{
foreach(
$abstract as $method)
{
$mname = $method->name;
$abstr_methods .= "public function $mname(){return false;}";
}
}

//Convert private attributes to public attributes
if(sizeof($priv_attr))
{
$parseable = unserialize(str_replace("\0$class\0", "\0*\0", serialize($obj)));
foreach(
$priv_attr as $attribute)
{
$aname = $attribute->name;
$privates[$aname] = $parseable->$aname;
}
}


$temp_child_class = "temp" . str_replace("_", "", "$class");

//You can gain access to protected attributes by extending the target class
$class_def = "
class
$temp_child_class extends $class{
$constructor
public function reflect_getmyvars(){
return get_object_vars(\$this);
}
$abstr_methods
}
"
;

//place class definition in memory
eval($class_def);

//generate object from dynamic class
$tcobj =@ new $temp_child_class;
//call the method we added to the object (to access protected vars)
$vars = $tcobj->reflect_getmyvars();

$attribs = array_merge($vars, $privates);

//will now show private attributes
print_r($attribs);
?>
up
2
Yzmir Ramirez
13 years ago
Have you tried:

<?php

echo "PHP Version: ".phpversion()."\n";

class
Foo
{
private
$bar = "private";
protected
$bar2 = "protected";
public
$bar3 = "public";
}

$obj = new Foo;

$arr = (array)$obj;

print_r($arr);
?>

Output:

PHP Version: 5.2.12
Array
(
[Foobar] => private
[*bar2] => protected
[bar3] => public
)

PHP Version: 5.1.6
Array
(
[Foobar] => private
[*bar2] => protected
[bar3] => public
)
To Top