Heim  >  Artikel  >  Backend-Entwicklung  >  php中如何在外部修改类的私有或受保护属性值

php中如何在外部修改类的私有或受保护属性值

WBOY
WBOYOriginal
2016-06-13 12:56:181411Durchsuche

php中怎么在外部修改类的私有或受保护属性值

在做单元测试框架时,发现了个比较郁闷的问题:测试人员需要在类外修改类的private或protected成员变量的值,而这些变量没有抽象成public的属性,同时为了代码量的问题,也不可能修改要测试的类。怎么在类外修改类的私有变量呢?请看下面的关键代码:

类文件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

上面的demo主要是通过反射实现该功能。反射功能需要php版本>=5.3,反射的相关信息请参阅:http://php.net/manual/en/book.reflection.php

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn