实例网站制作教程,页面设计需求需要做那些方面,报考二级建造师官网,域名跳转网站php中怎么在外部修改类的私有或受保护属性值在做单元测试框架时#xff0c;发现了个比较郁闷的问题#xff1a;测试人员需要在类外修改类的private或protected成员变量的值#xff0c;而这些变量没有抽象成public的属性#xff0c;同时为了代码量的问题#xff0c;也不可能…php中怎么在外部修改类的私有或受保护属性值在做单元测试框架时发现了个比较郁闷的问题测试人员需要在类外修改类的private或protected成员变量的值而这些变量没有抽象成public的属性同时为了代码量的问题也不可能修改要测试的类。怎么在类外修改类的私有变量呢请看下面的关键代码类文件sellAction.php 内容如下class SellAction{protected $cUid;private $id;public $pId;public function output(){echo output protected cUid :.$this-cUid;echo ;echo output private id :.$this-id;echo ;echo output public pId:.$this-pId;echo ;}}测试文件test.php内容如下require sellAction.php;function initReferenceAttr( $reference, $arr){if(!is_object($reference)){throw new Exception(reference must be object);}if(!is_array($arr)){throw new Exception(arr must be array);}$cls get_class($reference);$reflectCls new ReflectionClass ($cls);foreach($arr as $key $val){$pro $reflectCls-getProperty($key);if($pro ($pro-isPrivate() || $pro-isProtected())){$pro-setAccessible(true);$pro-setValue($reference, $val);}else{$reference-$key $val;}}return true;}$act new SellAction();echo not set private protect public var;echo ;var_dump($act);$act-output();$attr array(cUid234556, pId987676757, id 782100);initReferenceAttr($act, $attr);echo ;print_r($attr);echo ;echo ;echo set private protect public var ;echo ;var_dump($act);echo ;$act-output();在浏览器中直接浏览test.php内容大致如下not set private protect public varobject(SellAction)#1 (3) { [cUid:protected] NULL [id:SellAction:private] NULL [pId] NULL } output protected cUid :output private id :output public pId:Array ( [cUid] 234556 [pId] 987676757 [id] 782100 )set private protect public varobject(SellAction)#1 (3) { [cUid:protected] string(6) 234556 [id:SellAction:private] string(6) 782100 [pId] string(9) 987676757 }output protected cUid :234556output private id :782100output public pId:987676757上面的demo主要是通过反射实现该功能。反射功能需要php版本5.3反射的相关信息请参阅http://php.net/manual/en/book.reflection.php