Callbacks / Callables
Callbacks / Callables
Callbacks kan anges genom typen callable.
Vissa funktioner, som `call_user_func()` eller `usort()`, accepterar användardefinierade callback-funktioner som en parameter. Callback-funktioner kan inte bara vara enkla funktioner, utan även objektmetoder, inklusive statiska klassmetoder.
Skickande
En PHP-funktion skickas genom sitt namn som en sträng. Vilken inbyggd eller användardefinierad funktion som helst kan användas, förutom språkkonstruktioner som: `array()`, `echo`, `empty()`, `eval()`, `exit()`, `isset()`, `list()`, `print` eller `unset()`.
En metod från ett instanserat objekt skickas som en array som innehåller ett objekt på index 0 och metodnamnet på index 1. Åtkomst till skyddade och privata metoder från inom en klass är tillåtet.
Statiska klassmetoder kan också skickas utan att instansera ett objekt av den klassen genom att antingen skicka klassnamnet istället för ett objekt på index 0, eller genom att skicka 'ClassName::methodName'.
Förutom vanliga användardefinierade funktioner kan anonyma funktioner och arrow functions också skickas till en callback-parameter.
Notera:
Från och med PHP 8.1.0 kan anonyma funktioner också skapas med syntaxen för first class callables.
Generellt kan vilket objekt som helst som implementerar __invoke() också skickas till en callback-parameter.
Exempel #1 Callback-funktionsexempel
<?php
// Ett exempel på en callback-funktion
function my_callback_function() {
echo 'hello world!';
}
// Ett exempel på en callback-metod
class MyClass {
static function myCallbackMethod() {
echo 'Hello World!';
}
}
// Typ 1: Enkel callback
call_user_func('my_callback_function');
// Typ 2: Statiskt klassmetods-anrop
call_user_func(array('MyClass', 'myCallbackMethod'));
// Typ 3: Objektmetods-anrop
$obj = new MyClass();
call_user_func(array($obj, 'myCallbackMethod'));
// Typ 4: Statiskt klassmetods-anrop
call_user_func('MyClass::myCallbackMethod');
// Typ 5: Relativt statiskt klassmetods-anrop
class A {
public static function who() {
echo "A\n";
}
}
class B extends A {
public static function who() {
echo "B\n";
}
}
call_user_func(array('B', 'parent::who')); // A, föråldrat från och med PHP 8.2.0
// Typ 6: Objekt som implementerar __invoke kan användas som callables
class C {
public function __invoke($name) {
echo 'Hello ', $name, "\n";
}
}
$c = new C();
call_user_func($c, 'PHP!');
?>
Exempel #2 Callback-exempel med en Closure
<?php
// Vår closure
$double = function($a) {
return $a * 2;
};
// Detta är vårt nummerintervall
$numbers = range(1, 5);
// Använd closure som en callback här för att
// dubbla storleken på varje element i vårt
// intervall
$new_numbers = array_map($double, $numbers);
print implode(' ', $new_numbers);
?>
Det ovanstående exemplet kommer att ge följande resultat:
2 4 6 8 10
Notera:
Callbacks som registreras med funktioner som `call_user_func()` och `call_user_func_array()` kommer inte att anropas om det uppstår ett oinfångat undantag i en tidigare callback.