2014-10-01 16 views
6

Benim fonksiyonu, (hazırlamak), bir tanıma sahip

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

yükseltir (ve benim testi kırar)

ReflectionException: yöntem DB_Service çağırma :: prepare() bu

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

eserler mükemmel Ancak

başarısız ve test başarılıdır.

Neden değişken bildiriliyor ve sonra çalışmıyor, ancak yöntem çağrısı içinde oluşturuluyor neden çalışıyor? Bunun, invoke() 'nin nasıl çalıştığıyla ilgili bir şey olduğunu düşünüyorum, ama ne olduğunu anlayamıyorum. invoke belgelerine itibaren

cevap

8

:

Not: işlev referansları olması gerekiyor argümanları varsa, o zaman geçti argüman listesindeki referanslar olmalıdır.

sen değiştirirseniz Yani, ilk örnek çalışması gerekir:

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

DÜZENLEME: bir dizi ve invokeArgs kullanabilirsiniz pass-by-reference kaldırılan çağrı süresini önlemek için:

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

[Bu SO gönderisi] başına (http://stackoverflow.com/questions/8971261/php-5-4-call-time-pass-by-reis-easy-fix-available), bu kullanımdan kaldırılmıştır. PHP5 ve kullanımı önerilmez. Metod tanımında argümanı referans ile geçiyorum, bu yüzden tekrar arama yapmak doğru olmamalıdır. –

+0

@MatthewHerbst Kesinlikle haklısın, benim hatam. – wavemode

+0

Ah, bu invokeArgs harika. Teşekkür ederim! –

İlgili konular