Почему передача переменной по ссылке не работает при вызове рефлексивного метода?

Моя функция, prepare (), имеет определение:

частная функция подготовить (&$ data, $ condition = 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 (), но я не могу понять, что именно.

6

Решение

Из документации для взывать:

Примечание. Если функция имеет аргументы, которые должны быть ссылками, то они должны быть ссылками в переданном списке аргументов.

Итак, ваш первый пример должен работать, если вы измените его на:

$method->invoke($dbs, &$data, array('conditionKey' => 'conditionValue'), TRUE);

РЕДАКТИРОВАТЬ: Чтобы избежать устаревшей передачи вызовов по ссылке, вы можете использовать массив и аргументов вызова:

$method->invokeArgs($dbs, array(&$data, array('conditionKey' => 'conditionValue'), TRUE));
9

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]