2014-10-01 12 views
6

funzione My, preparare(), ha la definizione:Perché il passaggio di una variabile per riferimento non funziona quando si richiama un metodo riflettente?

funzione privata preparare (& $ dati, $ condizioni = null, $ conditionsRequired = false)

Quando ho provarlo, questo

/** 
    * @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); 
    } 

rilanci (e rompe la mia prova)

ReflectionException: Invocazione del metodo di DB_Service :: preparare() non è riuscito

Tuttavia, questo

/** 
    * @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); 
    } 

funziona perfettamente e la prova è riuscita.

Perché la dichiarazione della variabile e quindi il passaggio non funzionano, ma semplicemente la sua creazione nella chiamata al metodo funziona? Penso che questo abbia qualcosa a che fare con come invoke() funziona, ma non riesco a capire cosa.

risposta

8

Dalla documentazione per invoke:

Nota: Se la funzione ha argomenti che devono essere i riferimenti, allora devono essere riferimenti nella lista degli argomenti passati.

Così, il vostro primo esempio dovrebbe funzionare se si cambia a:

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

EDIT: Per evitare volta chiamata deprecata pass-by-di riferimento, è possibile utilizzare un array e invokeArgs:

+0

Per [questo post SO] (http://stackoverflow.com/questions/8971261/php-5-4-call-time-pass-by-reference-easy-fix-available), questo è deprecato in PHP5 e il suo utilizzo è scoraggiato. Nella definizione del metodo, passo l'argomento per riferimento, quindi farlo di nuovo nella chiamata non dovrebbe essere corretto. –

+0

@MatthewHerbst Hai perfettamente ragione, mio ​​errore. – wavemode

+0

Ah, che invokeArgs è fantastico. Grazie! –

Problemi correlati