PHP でクラスの private または protected 属性値を外部から変更する方法
単体テスト フレームワークの作業中に、かなり憂鬱な問題を発見しました。クラスのプライベートまたは保護されたメンバー変数の値をクラス外で変更しますが、これらの変数はパブリック属性に抽象化されません。同時に、コードのサイズにより、クラスを変更することはできません。テストされました。クラスの外部でクラスのプライベート変数を変更するにはどうすればよいですか?以下のキーコードをご覧ください:
クラス ファイル sellAction.php、内容は次のとおりです:
<?php class SellAction{ protected $cUid; private $id; public $pId; public function output(){ echo "output protected cUid :".$this->cUid; echo "<br/>"; echo "output private id :".$this->id; echo "<br/>"; echo "output public pId:".$this->pId; echo "<br/>"; } }
<?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 "<br/>"; var_dump($act); $act->output(); $attr = array('cUid'=>'234556', 'pId'=>'987676757', 'id'=> '782100'); initReferenceAttr($act, $attr); echo "<br/>"; print_r($attr); echo "<br/>"; echo "<br/>"; echo "set private protect public var "; echo "<br/>"; var_dump($act); echo "<br/>"; $act->output();
ブラウザで test.php を直接参照します。内容は次のとおりです:
not set private protect public var object(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 var object(SellAction)#1 (3) { ["cUid":protected]=> string(6) "234556" ["id":"SellAction":private]=> string(6) "782100" ["pId"]=> string(9) "987676757" } output protected cUid :234556 output private id :782100 output public pId:987676757
上記のデモは主にリフレクションを通じてこの関数を実装しています。リフレクション機能には PHP バージョン 5.3 以上が必要です。リフレクション関連の情報については、http://php.net/manual/en/book.reflection.php