提问者:小点点

如何在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反射类的解决方案。 它在我的本地工作,但在服务器上的PHP版本是5.2.17,所以我不能在那里使用这个函数。 那么有什么解决办法如何得到这样的财产呢?


共3个答案

匿名用户

这就是“受保护”的用意,正如可见性一章所解释的那样:

声明为受保护的成员只能在类本身内以及由继承和父类访问。

如果您需要从外部访问该物业,请选择一个:

  • 不要将其声明为受保护的,而是将其公开
  • 编写两个函数来获取和设置值(getters和setters)

如果您不想修改原始类(因为它是第三方库,您不想弄乱它),请创建一个扩展原始类的自定义类:

class MyFields_Form_Element_Location extends Fields_Form_Element_Location{
}

。。。然后在那里添加你的getter/setter。

匿名用户

下面是如何使用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的注释)。 使用这个未文档化的特性,您可以编写一个“公开程序”:

function getProtectedValue($obj,$name) {
  $array = (array)$obj;
  $prefix = chr(0).'*'.chr(0);
  return $array[$prefix.$name];
}

或者,您可以从序列化字符串中解析值,其中(看起来)受保护的成员具有相同的前缀(我希望php 5.2没有更改它)。