ReflectionProperty::setAccessible
(PHP 5 >= 5.3.0)
ReflectionProperty::setAccessible — Задание доступности свойства
Описание
public void ReflectionProperty::setAccessible
( bool
$accessible
)Делает свойство доступным. Например, может сделать доступным защищенное и частное свойство.
Список параметров
-
accessible
-
TRUE
делает свойство доступным,FALSE
- закрывает доступ к свойству.
Возвращаемые значения
Эта функция не возвращает значения после выполнения.
Смотрите также
- ReflectionProperty::isPrivate() - Проверяет, является ли свойство частным (private)
- ReflectionProperty::isProtected() - Проверяет, является ли свойство защищенным (protected)
- PHP Руководство
- Функции по категориям
- Индекс функций
- Справочник функций
- Расширения, относящиеся к переменным и типам
- Reflection
- Функция 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() - Преобразование в строку
Коментарии
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);
?>
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
)
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)
?>