Callbacks / Callables

Från Wiki.linux.se
Version från den 13 augusti 2024 kl. 07.16 av Admin (diskussion | bidrag) (→‎Skickande)
(skillnad) ← Äldre version | Nuvarande version (skillnad) | Nyare version → (skillnad)
Hoppa till navigering Hoppa till sök

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.

PHP

Språkreferens