Zastanawiałem się, czy możliwe jest przekazanie funkcji jako parametru w PHP; Chcę czegoś takiego jak programowanie w JS:
object.exampleMethod(function(){
// some stuff to execute
});
Chcę wykonać tę funkcję gdzieś w exampleMethod. Czy to możliwe w PHP?
Odpowiedzi:
Jest to możliwe, jeśli używasz PHP 5.3.0 lub nowszego.
Zobacz Funkcje anonimowe w podręczniku.
W twoim przypadku możesz zdefiniować w
exampleMethod
ten sposób:źródło
create_function
create_function()
. To nie to samo, ponieważ musisz przekazać swoją funkcję jako ciąg kodu, który następnie dostaje sięeval()
za kulisy. Nie jest to idealne rozwiązanie, ale możesz go użyć.exampleMethod(strpos);
Aby dodać do innych, możesz przekazać nazwę funkcji:
To zadziała w PHP4.
źródło
Możesz również użyć funkcji create_function, aby utworzyć funkcję jako zmienną i przekazać ją. Chociaż wolę poczucie anonimowości . Idź zombat.
źródło
Po prostu zakoduj to w ten sposób:
byłoby wspaniale, gdybyś mógł wymyślić coś takiego (inspirowane Laravel Illuminate):
źródło
WERSJA PHP> = 5.3.0
Przykład 1: podstawowy
Przykład 2: obiekt std
Przykład 3: niestatyczne wywołanie klasy
Przykład 4: statyczne wywołanie klasy
źródło
Zgodnie z odpowiedzią @ zombat, lepiej najpierw zweryfikować funkcje anonimowe:
Lub sprawdź poprawność typu argumentu od PHP 5.4.0:
źródło
Przetestowano pod kątem PHP 5.3
Jak widzę tutaj, funkcja anonimowa może ci pomóc: http://php.net/manual/en/functions.anonymous.php
To, czego prawdopodobnie będziesz potrzebować, a nie zostało powiedziane wcześniej, to sposób przekazywania funkcji bez zawijania jej wewnątrz funkcji utworzonej w locie . Jak zobaczysz później, musisz przekazać nazwę funkcji zapisaną w łańcuchu jako parametr, sprawdzić jej „możliwość wywołania”, a następnie wywołać ją.
Funkcja do sprawdzenia:
Następnie, aby to wywołać, użyj tego fragmentu kodu (jeśli potrzebujesz również parametrów, umieść je w tablicy), patrz: http://php.net/manual/en/function.call-user-func.php
jak to następuje (w podobny, bezparametrowy sposób):
Oto klasa wyjaśniająca, jak zrobić coś podobnego:
i przykład użycia
źródło
Prosty przykład z użyciem klasy:
źródło