Συναρτήσεις επανάκλησης (Callbacks) στην PHP

Συνάρτηση επανάκλησης (Callback) ονομάζεται μια συνάρτηση, που μεταβιβάζεται ως παράμετρος σε μια άλλη συνάρτηση.

Ας δούμε ένα παράδειγμα. Ας υποθέσουμε ότι έχουμε μια συνάρτηση που αποδέχεται ως πρώτη παράμετρο έναν αριθμό, και ως δεύτερη παράμετρο - μια συνάρτηση επανάκλησης:

php<?php
  function func($num, $calb)
  {
    
  }
?>

Ας κάνουμε έτσι ώστε μέσα στη συνάρτηση η συνάρτηση επανάκλησης μας να κληθεί για τον αριθμό που μεταβιβάστηκε:

php<?php
  function func($num, $calb)
  {
    echo $calb($num);
  }
?>

Ας δούμε τώρα ποιες επιλογές έχουμε για τη μεταβίβαση της συνάρτησης επανάκλησης στη συνάρτησή μας.

Επιλογή 1

Η συνάρτηση επανάκλησης μας μπορεί να είναι μια συνηθισμένη συνάρτηση:

php<?php
  function calb($num) {
    return $num ** 2;
  }
?>

Σε αυτή την περίπτωση, ως συνάρτηση επανάκλησης θα μεταβιβάσουμε το όνομα της συνάρτησής μας:

php<?php
  func(3, 'calb');
?>

Μέσα στη συνάρτηση func η συνάρτηση επανάκλησης θα κληθεί με βάση το όνομά της.

Επιλογή 2

Η συνάρτηση επανάκλησης μας μπορεί να είναι μια ανώνυμη συνάρτηση, που έχει αποθηκευτεί σε μια μεταβλητή:

php<?php
  $calb = function($num) {
    return $num ** 2;
  };
?>

Σε αυτή την περίπτωση, μεταβιβάζουμε ως παράμετρο τη μεταβλητή που περιέχει τη συνάρτησή μας:

php<?php
  func(3, $calb);
?>

Επιλογή 3

Μπορούμε να μεταβιβάσουμε την ανώνυμη συνάρτηση αμέσως ως παράμετρο:

php<?php
  func(3, function($num) {
    return $num ** 2;
  });
?>

Επιλογή 4

Μπορούμε να συντομεύσουμε τον κώδικα, χρησιμοποιώντας συνάρτηση βέλους:

php<?php
  func(3, fn($num) => $num ** 2);
?>

Πρακτικές ασκήσεις

Задание 1

Δίνεται μια συνάρτηση, που δέχεται ως παράμετρο έναν πίνακα και μια συνάρτηση επανάκλησης, η οποία θα εφαρμοστεί σε κάθε στοιχείο του πίνακα:

php<?php
  function func($arr, $calb)
  {
    $res = [];
    
    foreach ($arr as $elem) {
      $res[] = $calb($elem);
    }
    
    return $res;
  }
?>

Καλέστε αυτή τη συνάρτηση, μεταβιβάζοντας ως παράμετρο έναν πίνακα με αριθμούς και μια συνάρτηση επανάκλησης, που υψώνει τον αριθμό που μεταβιβάστηκε στο τετράγωνο.