在PHP单元测试的时候执行私有(protected, private)方法的方法

用PHPUnit单元测试的时候经常遇到要测试私有方法的情况发生
万能的PHP提供反射机制,它可以重构原有类库的,还可以扩展原生PHP代码的
扩展这么高端的俺们就耗不起~

正入主题,看代码吧。

/**
 * 执行protect private方法
 * @param  string $object 类名
 * @param  string $method 方法名
 * @param  array  $args   方法接口参数
 * @return [type]         返回该方法返回值
 */
public function call_private_method($object, $method, $args = array()) {
    $reflection = new ReflectionClass(get_class($object));
    $closure = $reflection->getMethod($method)->getClosure($object);
    return call_user_func_array($closure, $args);
}

来个例子~

class testClass {
    protected function sum($a,$b){
        echo 'sum : '. ($a+$b);
    }

    private function a(&$d){
        echo 'this is a : '.$d;
        $d = 'last';
    }
}

call_private_method(new testClass(),'sum',array(100,50));
//输出结果:sum : 150

$val = 'test';
call_private_method(new testClass(),'a',array(&$val));
var_dump($val);
//输出结果:this is a : teststring(4) "last"