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

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

WBOY
リリース: 2016-06-13 12:56:18
オリジナル
1474 人が閲覧しました

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

を参照してください。
関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート