2010-10-01 12 views
30

Jeśli używam array_walk wewnątrz funkcji klasy wywołać inną funkcję o tej samej klasieJak używać metody klasy jako funkcji zwrotnej?

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 
    } 

} 

Daje mi następujący błąd -

Ostrzeżenie: array_walk() [function.array-Walk]: Nie zadzwonić test_print() - funkcja nie istnieje w ...

Tak, jak mogę określić $this->test_print() WH ile używając array_walk()?

+0

Dowolny powód, dla którego stworzyłeś funkcję 'isNonEmptyArray' zamiast po prostu używać'! empt y (...) '? –

+0

tak, zwraca true tylko wtedy, gdy parametr jest tablicą z co najmniej jedną niepustą wartością –

Odpowiedz

58

Jeśli chcesz określić metody klasy jako wywołania zwrotnego, należy określić przedmiot należy do:

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

Od manual:

sposób obsługi instancja obiektu jest przekazywana jako tablica zawierająca obiekt o indeksie 0 i nazwa metody o indeksie 1.

Zobacz http://www.ideone.com/oz3Ma, aby zobaczyć to w akcji.

+0

Tak Próbowałem wcześniej, ale daje mi ten błąd - Ostrzeżenie: array_walk() [function.array-walk: Nie można wywołać Array() - funkcja nie istnieje w 'Jednak to działa' array_walk ($ fieldsArray, 'user :: test_print'); '. Więc co jest nie tak. Chciałem użyć '$ this' –

+0

Jaką wersję PHP? – tj111

+1

Czy możesz pokazać dokładny kod, który nie działa (który wyświetla ostrzeżenie)? – ircmaxell

5

Jeśli trzeba wywołać metodę statyczną bez instancji klasy można zrobić tak:

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

lub z zewnątrz:

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

wywołać metodę klasy jako funkcję zwrotną w innym metoda klasy, powinieneś zrobić:

public function compareFucntion() { 
} 

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