Как получить защищенное свойство объекта в PHP
у меня есть объект, имеющий некоторое защищенное свойство, которое я хочу получить и установить. Объект выглядит как
Fields_Form_Element_Location Object
(
[helper] => formText
[_allowEmpty:protected] => 1
[_autoInsertNotEmptyValidator:protected] => 1
[_belongsTo:protected] =>
[_description:protected] =>
[_disableLoadDefaultDecorators:protected] =>
[_errorMessages:protected] => Array
(
)
[_errors:protected] => Array
(
)
[_isErrorForced:protected] =>
[_label:protected] => Current City
[_value:protected] => 93399
[class] => field_container field_19 option_1 parent_1
)
Я хочу сделать value
свойства объекта. Когда я пытаюсь $obj->_value
или $obj->value
Он генерирует ошибку. Я искал и нашел решение для использования PHP Reflection Class
. Он работал на моем локальном, но на сервере PHP версия 5.2.17
поэтому я не могу использовать эту функцию. Итак, любое решение, как получить такую собственность?
6 ответов
Это то, что" защищено " предназначено для, как видимость глава объясняет:
члены, объявленные защищенными, могут быть доступны только внутри самого класса и наследуемыми и родительскими классами.
Если вам нужно получить доступ к свойству извне, выбери одну:
- не объявляйте его защищенным, сделайте его общедоступным вместо
- напишите пару функций, чтобы получить и установить значение (геттеры и сеттеры)
Если вы не хотите изменять исходный класс (потому что это сторонняя библиотека, которую вы не хотите испортить), создайте пользовательский класс, который расширяет исходный:
class MyFields_Form_Element_Location extends Fields_Form_Element_Location{
}
... и добавьте туда свой геттер / сеттер.
вот очень простой пример (без проверки ошибок), как использовать ReflectionClass
:
function accessProtected($obj, $prop) {
$reflection = new ReflectionClass($obj);
$property = $reflection->getProperty($prop);
$property->setAccessible(true);
return $property->getValue($obj);
}
Я знаю, вы сказали, что ограничились 5,2, но это было 2 года назад,5.5-самая старая поддерживаемая версия и я надеюсь помочь людям с современными версиями.
объект может быть типизирован в (ассоциативный) массив, а защищенные члены имеют ключи с префиксом chr(0).'*'.chr(0)
(см. комментарий @fardelian здесь). Используя эту недокумментированную функцию, вы можете написать "exposer":
function getProtectedValue($obj,$name) {
$array = (array)$obj;
$prefix = chr(0).'*'.chr(0);
return $array[$prefix.$name];
}
кроме того, вы можете проанализировать стоимость от сериализованные string, где (кажется) защищенные члены имеют тот же префикс (надеюсь, php 5.2 не изменил его).
Если вы хотите повозиться с классом без добавления геттеров и сеттеров....
PHP 7 добавляет метод вызова ($obj) (быстрее, чем старый bindTo) на замыканиях, позволяя вам вызывать функцию, поэтому $this
переменной будет действовать так же, как и в классе -с полными разрешениями.
//test class with restricted properties
class test{
protected $bar="protected bar";
private $foo="private foo";
public function printProperties(){
echo $this->bar."::".$this->foo;
}
}
$testInstance=new test();
//we can change or read the restricted properties by doing this...
$change=function(){
$this->bar="I changed bar";
$this->foo="I changed foo";
};
$change->call($testInstance);
$testInstance->printProperties();
//outputs I changed bar::I changed foo in php 7.0
Если вы не можете изменить исходный класс и его расширение также не является опцией, вы можете использовать интерфейс ReflectionProperty.
библиотека phptoolcase имеет удобный метод для этого:
$value = PtcHandyMan::getProperty( $your_object , ‘propertyName’);
статическое свойство из одноэлементного класса:
$value = PtcHandyMan::getProperty( ‘myCLassName’ , ‘propertyName’);
вы можете найти инструмент здесь:http://phptoolcase.com/guides/ptc-hm-guide.html
$propGetter = Closure::bind( function($prop){return $this->$prop;}, $element['field_text']['#object'], $element['field_text']['#object'] );
drupal_set_message('count='.count($propGetter('hostEntity')->field_captioned_carousel['und']));