为什么在调用反射方法时通过引用传递变量不起作用?

Mat*_*bst 6 php reflection phpunit pass-by-reference

我的函数prepare()具有以下定义:

私有函数prepare(&$ data,$ conditions = null,$ conditionsRequired = false)

当我测试它时,这个

  /**
  * @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);
  }
Run Code Online (Sandbox Code Playgroud)

加注(并打破我的考验)

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);
  }
Run Code Online (Sandbox Code Playgroud)

工作完美,测试成功.

为什么声明变量然后传递不起作用,而只是在方法调用中创建它确实有效?我认为这与invoke()的工作原理有关,但我似乎无法弄清楚是什么.

wav*_*ode 9

调用文档:

注意:如果函数具有需要引用的参数,则它们必须是传递的参数列表中的引用.

因此,如果您将其更改为:第一个示例应该有效:

$method->invoke($dbs, &$data, array('conditionKey' => 'conditionValue'), TRUE);
Run Code Online (Sandbox Code Playgroud)

编辑:为了避免不推荐的调用时间传递引用,您可以使用数组和invokeArgs:

$method->invokeArgs($dbs, array(&$data, array('conditionKey' => 'conditionValue'), TRUE));
Run Code Online (Sandbox Code Playgroud)