2014-10-01 4 views
6

मेरे समारोह, तैयार(), परिभाषा है

/** 
    * @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 की प्रार्थना किए :: तैयार()

हालांकि विफल रहा है, इस

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

काम करता है पूरी तरह से और परीक्षण सफल रहा है।

वैरिएबल घोषित क्यों करता है और फिर काम नहीं कर रहा है, लेकिन बस इसे विधि कॉल में बनाना काम करता है? मुझे लगता है कि यह कैसे काम करता है() काम करता है, लेकिन मुझे पता लगाना प्रतीत नहीं होता है।

उत्तर

8
invoke के लिए दस्तावेज़ से

:

नोट: समारोह तर्क संदर्भ होने की जरूरत है कि है, तो वे पारित कर दिया तर्क सूची में संदर्भ होना चाहिए।

तो, अपना पहला उदाहरण यदि आप इसे करने के लिए बदल काम करना चाहिए:

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

संपादित करें: से बचने के लिए अमान्य हो चुकी कॉल समय व्यतीत-दर-संदर्भ, आप एक सरणी और invokeArgs उपयोग कर सकते हैं:

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

प्रति [इस अतः पोस्ट] (http://stackoverflow.com/questions/8971261/php-5-4-call-time-pass-by-reference-easy-fix-available), इस बहिष्कृत हो गई है PHP5 में और इसका उपयोग निराश है। विधि परिभाषा में मैं संदर्भ द्वारा तर्क पारित करता हूं, इसलिए कॉल में फिर से ऐसा करना सही नहीं होना चाहिए। –

+0

@ मैथ्यूहेर्बस्ट आप बिल्कुल सही हैं, मेरी गलती। – wavemode

+0

आह, यह invokeArgs महान है। धन्यवाद! –

संबंधित मुद्दे

 संबंधित मुद्दे