2014-10-01 39 views
6

chức năng của tôi, chuẩn bị(), có nghĩa:Tại sao truyền biến bằng tham chiếu không hoạt động khi gọi phương thức phản xạ?

chức năng tin chuẩn bị (& $ data, $ conditions = null, $ conditionsRequired = false)

Khi tôi kiểm tra nó, điều này

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

tăng lương (và phá vỡ thử nghiệm của tôi)

ReflectionException: Gọi phương pháp DB_Service :: chuẩn bị() thất bại

Tuy nhiên, đây

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

công trình hoàn hảo và thử nghiệm thành công.

Tại sao tuyên bố biến và sau đó không hoạt động, nhưng chỉ đơn giản là tạo nó trong lời gọi phương thức hoạt động? Tôi nghĩ rằng điều này có một cái gì đó để làm với cách gọi() hoạt động, nhưng tôi không thể có vẻ để tìm ra những gì.

Trả lời

8

Từ tài liệu cho invoke:

Lưu ý: Nếu hàm có đối số mà cần phải tham khảo, sau đó họ phải tham khảo trong danh sách đối số truyền.

Vì vậy, ví dụ đầu tiên bạn nên làm việc nếu bạn thay đổi nó để:

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

EDIT: Để tránh thời gian gọi NỮA pass-by-reference, bạn có thể sử dụng một mảng và invokeArgs:

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

Mỗi [bài đăng SO này] (http://stackoverflow.com/questions/8971261/php-5-4-call-time-pass-by-reference-easy-fix-available), điều này không được chấp nhận trong PHP5 và việc sử dụng nó không được khuyến khích. Trong định nghĩa phương thức, tôi chuyển đối số bằng tham chiếu, do đó, làm như vậy một lần nữa trong cuộc gọi không đúng. –

+0

@MatthewHerbst Bạn hoàn toàn đúng, sai lầm của tôi. – wavemode

+0

Ah, mà invokeArgs là tuyệt vời. Cảm ơn bạn! –

Các vấn đề liên quan