ホームページ  >  記事  >  バックエンド開発  >  PHPでクラスのprivateまたはprotected属性値を外部から変更する方法

PHPでクラスのprivateまたはprotected属性値を外部から変更する方法

WBOY
WBOYオリジナル
2016-06-13 12:56:181411ブラウズ

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/>";
	}
}

テストファイル test.php の内容は次のとおりです。

<?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

を参照してください。
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。