2010-10-01 10 views
30

Nếu tôi sử dụng array_walk bên trong một hàm lớp để gọi một chức năng của cùng một lớpLàm cách nào để sử dụng phương thức lớp làm chức năng gọi lại?

class user 
{ 
    public function getUserFields($userIdsArray,$fieldsArray) 
    { 

    if((isNonEmptyArray($userIdsArray)) && (isNonEmptyArray($fieldsArray))) 
    { 
     array_walk($fieldsArray, 'test_print'); 
    } 
    } 


    private function test_print($item, $key) 
    { 
     //replace the $item if it matches something 
    } 

} 

Nó mang lại cho tôi những lỗi sau -

Cảnh báo: array_walk() [function.array-đi bộ]: Không thể để gọi test_print() - chức năng không tồn tại trong ...

Vì vậy, làm thế nào để xác định $this->test_print() wh ile sử dụng array_walk()?

+0

Bất kỳ lý do nào bạn đã tạo hàm 'isNonEmptyArray' thay vì chỉ sử dụng'! empt y (...) '? –

+0

có, nó trả về true chỉ khi param là một mảng có ít nhất một giá trị không trống –

Trả lời

58

Nếu bạn muốn chỉ định một phương pháp học như một gọi lại, bạn cần phải xác định đối tượng nó thuộc về:

array_walk($fieldsArray, array($this, 'test_print')); 

Từ manual:

Một phương pháp của một đối tượng khởi tạo là được chuyển thành một mảng chứa đối tượng tại chỉ mục 0 và tên phương thức tại chỉ mục 1.

Kiểm tra http://www.ideone.com/oz3Ma để xem điều này trong hành động.

+0

Có tôi đã thử điều này trước đây nhưng nó cho tôi lỗi này - 'Warning: array_walk() [function.array-walk: Unable to call Array() - chức năng không tồn tại trong 'Tuy nhiên điều này đang làm việc' array_walk ($ fieldsArray, 'user :: test_print'); '. Vì vậy, những gì là sai. Tôi muốn sử dụng '$ this' –

+0

Phiên bản nào của PHP? – tj111

+1

Bạn có thể hiển thị mã chính xác không hoạt động (có vấn đề cảnh báo) không? – ircmaxell

5

Nếu bạn cần gọi một phương thức tĩnh mà không instantiating lớp bạn có thể làm như vậy:

// since PHP 5.3 
array_walk($fieldsArray, 'self::test_print'); 

Hoặc từ bên ngoài:

// since PHP 5.5 
array_walk($fieldsArray, User::class.'::test_print'); 
1

Để gọi một phương thức lớp như một chức năng gọi lại trong một phương pháp lớp học, bạn nên làm:

public function compareFucntion() { 
} 

public function useCompareFunction() { 
    usort($arrayToSort, [$this, 'compareFucntion']) 
}