如何在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 ,会产生错误。 我search并find了使用PHP Reflection Class的解决scheme。 它工作在我的本地,但在服务器上的PHP版本是5.2.17所以我不能在这里使用这个function。 那么任何解决scheme如何获得这样的财产?

这就是“保护”的意思,因为可见性章节解释:

声明保护的成员只能在类本身以及inheritance类和父类中访问。

如果您需要从外面访问该房产,请select一个:

  • 不要声明它是受保护的,而应该公之于众
  • 写几个函数来获取和设置值(getter和setter)

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

 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是最老的支​​持版本 ,我希望帮助现代版本的人。

可以将对象types化为(关联)数组,受保护的成员的键以chr(0).'*'.chr(0)为前缀(请参阅@ fardelian的评论)。 使用这个未被分开的function,你可以写一个“曝光”:

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

或者,你可以从序列化的stringparsing值,其中(似乎)受保护的成员有相同的前缀(我希望PHP 5.2没有改变它)。

如果您不能修改原始类并扩展它,那么您也可以使用ReflectionProperty接口。

phptoolcase库有一个方便的方法:

 $value = PtcHandyMan::getProperty( $your_object , 'propertyName'); 

来自单例类的静态属性:

 $value = PtcHandyMan::getProperty( 'myCLassName' , 'propertyName'); 

你可以在这里find这个工具: http : //phptoolcase.com/guides/ptc-hm-guide.html

如果你想鼓励一个class级,而不添加getters和setter ….

PHP 7在闭包上添加了一个调用($ obj)方法(比旧的bindTo更快),从而允许您调用一个函数,这样$thisvariables的行为就像在一个类中一样 – 具有完全权限。

  //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 
  $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']));