Scriptorama.nl

Header image showing a keyboard, mouse, laptop and books on design patterns

Callbacks in PHP

Verschillende functies in PHP beschikken over de mogelijkheid om met een zogenaamde user-callback te werken. De functie array_map() bijvoorbeeld voert de opgegeven functie uit op elk element van de opgegeven array. Leer hoe je in deze functies ook methodes op objecten en statische klassen kunt gebruiken!

U riep?

Normaal gesproken wordt een callback in PHP gedefinieerd als een string met daarin de naam van een functie:

PHP:
  1. function stripslashes_callback($val)
  2. {
  3.   return get_magic_quotes_gpc() ? stripslashes($val) : '';
  4. }
  5.  
  6.   array_map('stripslashes_callback', $_GET)
  7. );

Callbacks met klassen en objecten

Maar het is nu niet meteen duidelijk hoe je met array_map() nu juist een methode van een klasse kunt aanroepen. PHP heeft dit opgelost door op de plek van een callback zowel een string als een array met de benodigde informatie te accepteren:

PHP:
  1. class HttpRequest
  2. {
  3.   var $_gpcActive = FALSE;
  4.  
  5.   function HttpRequest()
  6.   {
  7.     $this->_gpcActive = get_magic_quotes_gpc();
  8.   }
  9.  
  10.   function StripMagicQuotes_callback($value)
  11.   {
  12.     return ($this->_gpcActive ? stripslashes($value) : $value);
  13.   }
  14. }
  15.  
  16. $httpReq = new HttpRequest();
  17. $rawGet = array_map (
  18.   array ( $httpReq, 'StripMagicQuotes_callback' ),
  19.   $_GET
  20. );
  21.  
  22. var_dump($rawGet);

Op vrijwel dezelfde methode kun je ook statische methodes uit een klasse aanroepen. Het verschil is dat je in plaats van de instantie als 1e array element juist een string opgeeft met daarin de klasse naam:

PHP:
  1. class HttpRequest
  2. {
  3.   function StripMagicQuotes_callback()
  4.   {
  5.     return stripslashes($value);
  6.   }
  7. }
  8.  
  9. $rawGet = array_map (
  10.   array ( 'HttpRequest', 'StripMagicQuotes_callback' ),
  11.   $_GET
  12. );
  13.  
  14. var_dump($rawGet);

Zelf callbacks gebruiken

Callbacks zijn meer dan alleen array_map(), al is dat wel een ontzettend handige functie. Je kunt natuurlijk zelf ook een callback systeem implementeren voor een functie van jezelf. Je levert een stukje performance in maar krijgt daarvoor een enorm stuk flexibiliteit terug. Met de in Dynamische functies aanroepen in PHP beschreven call_user_func_array() functie kun je met enkele regels zelf gemakkelijk een callback-enabled functie maken. Dit zou bijvoorbeeld de PHP-implementatie van array_map() zijn:

PHP:
  1. function array_map_revisited ( $callback, $array )
  2. {
  3.   foreach ($array as $key => $val) {
  4.     $array[$key] = call_user_func_array($callback, array($val));
  5.   }
  6.  
  7.   return $array;
  8. }

Conclusie

Callbacks, zeker in combinatie met arrays, nemen wat performance in maar zijn vervolgens een enorm flexibele en krachtige tool in je ontwikkelaars toolbox.

Reageer ook!

Vooral preg_replace_callback() is onmisbaar :)

Zie ook de 'e' modifier voor preg_replace($pattern, $replacement, $subject) waarmee $replacement wordt geƫvalueerd als PHP code nadat backreferences zijn verwerkt: http://www.php.net/manual/en/reference.pcre.pattern.modifiers.php.
Zorgvuldig input controleren is hier geen overbodige luxe om code injectie te voorkomen.

[...] We kunnen meteen even gebruik maken van de kennis die in het artikeltje Callbacks in PHP wordt beschreven om deze variabelen om te zetten in de juiste encoding en in een bruikbaar formaat: PLAIN TEXT PHP: [...]

[...] en functies dynamisch aan te roepen. Daar hebben we op Scriptorama al eens over geschreven: Callbacks in PHP. Er was echter altijd een beperking met statische aanroepen, hiervoor moest je altijd de ietwat [...]

Leave a comment
Line and paragraph breaks automatic, e-mail address never displayed, HTML allowed: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>