Vitendo-vipokezi (Callbacks) katika PHP

Kitendo-kipokezi ni kitendakazi kinachopitishwa kama kigezo kingine katika kitendakazi.

Hebu tuangalie kwa mfano. Tuchukulie tuna kitendakazi ambacho kinakubali nambari kama kigezo cha kwanza, na kitendo-kipokezi kama kigezo cha pili:

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

Tufanye ili ndani ya kitendakazi kitendo-chetu-kipokezi kiitwe kwa nambari iliyopitishwa:

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

Hebu sasa tuone, ni njia gani za kupitisha kitendo-kipokezi katika kitendakazi chetu.

Njia 1

Kitendo-chetu-kipokezi kinaweza kuwa kitendakazi cha kawaida:

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

Katika hali hii kama kitendo-kipokezi tutapitisha jina la kitendakazi chetu:

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

Ndani ya kitendakazi func kitendo-chetu-kipokezi kitaitwa kwa jina.

Njia 2

Kitendo-chetu-kipokezi kinaweza kuwa kitendakazi bila jina, kiliandikwa kwenye kigeuzi:

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

Katika hali hii tunapitisha kigeuzi na kitendakazi chetu kama kigezo:

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

Njia 3

Inawezekana kupitisha kitendakazi bila jina moja kwa moja kama kigezo:

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

Njia 4

Inawezekana kufupisha msimbo, kwa kutumia kitendakazi-kishale:

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

Kazi za Vitendo

Задание 1

Kuna kitendakazi, kinachokubali orodha kama kigezo na kitendo-kipokezi, ambacho kitatumika kwa kila kipengele cha orodha:

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

Ita kitendakazi hiki, upitishae kama kigezo orodha yenye nambari na kitendo-kipokezi, kinachoinua nambari iliyopitishwa mraba.