我的函数prepare()具有以下定义:
私人函数prepare(& $ data,$ conditions = null, $ conditionsRequired =假)
当我测试它时,这个
/**
* @covers /data/DB_Service::prepare
* @uses /inc/config
*/
public function testNoExceptionIsRaisedForValidPrepareWithConditionsAndConditionsRequiredArguments() {
$method = new ReflectionMethod('DB_Service', 'prepare');
$method->setAccessible(TRUE);
$dbs = new DB_Service(new Config(), array('admin', 'etl'));
$data = array('message' => '', 'sql' => array('full_query' => ""));
$method->invoke($dbs, $data, array('conditionKey' => 'conditionValue'), TRUE);
}
加注(并打破我的考验)
ReflectionException:调用方法DB_Service :: prepare()失败
但是,这个
/**
* @covers /data/DB_Service::prepare
* @uses /inc/config
*/
public function testNoExceptionIsRaisedForValidPrepareWithConditionsAndConditionsRequiredArguments() {
$method = new ReflectionMethod('DB_Service', 'prepare');
$method->setAccessible(TRUE);
$dbs = new DB_Service(new Config(), array('admin', 'etl'));
//$data is no longer declared - the array is directly in the call below
$method->invoke($dbs, array('message' => '', 'sql' => array('full_query' => "")), array('conditionKey' => 'conditionValue'), TRUE);
}
完美无缺,测试成功。
为什么声明变量然后传递不起作用,只是在方法调用中创建它确实有效?我认为这与invoke()的工作方式有关,但我似乎无法弄清楚是什么。
答案 0 :(得分:9)
来自invoke的文档:
注意:如果函数的参数需要引用,那么它们必须是传递的参数列表中的引用。
因此,如果将其更改为:
,则第一个示例应该有效$method->invoke($dbs, &$data, array('conditionKey' => 'conditionValue'), TRUE);
编辑:为了避免不推荐使用过时的调用时间,您可以使用数组invokeArgs:
$method->invokeArgs($dbs, array(&$data, array('conditionKey' => 'conditionValue'), TRUE));