توابع Callback

توابع Callback در PHP — anonymous functions، closures، arrow functions و استفاده در array_map، usort

Callback چیست؟

Callback تابعی است که به‌عنوان آرگومان به تابع دیگر داده می‌شود. بسیاری از توابع PHP از callback استفاده می‌کنند.

روش ۱: نام تابع به‌عنوان callback

<?php
function myCallback($item) {
    return strtoupper($item);
}

$fruits = ["apple", "banana", "cherry"];
$result = array_map("myCallback", $fruits);
// ["APPLE", "BANANA", "CHERRY"]
?>

روش ۲: Anonymous Function (تابع بی‌نام)

<?php
$result = array_map(function($item) {
    return strtoupper($item);
}, $fruits);
?>

روش ۳: Arrow Function (PHP 7.4+)

<?php
$result = array_map(fn($item) => strtoupper($item), $fruits);
?>

Anonymous Functions (Closure)

توابع بی‌نام متغیرهایی هستند که تابع در آن‌ها ذخیره می‌شود:

<?php
$greet = function($name) {
    return "سلام $name!";
};

echo $greet("علی");  // سلام علی!
?>

use — دسترسی به متغیر بیرونی

توابع بی‌نام به‌صورت پیش‌فرض به متغیرهای بیرونی دسترسی ندارند. باید با use آن‌ها را وارد کنید:

<?php
$prefix = "آقای/خانم";

$greet = function($name) use ($prefix) {
    return "سلام $prefix $name!";
};

echo $greet("محمدی");  // سلام آقای/خانم محمدی!
?>

Arrow Functions و متغیر بیرونی

Arrow functions به‌صورت خودکار به متغیرهای بیرونی دسترسی دارند:

<?php
$multiplier = 3;

$multiply = fn($n) => $n * $multiplier;

echo $multiply(5);  // 15

// تغییر متغیر بیرونی
$multiplier = 10;
echo $multiply(5);  // 15 (مقدار زمان تعریف استفاده می‌شود)
?>

استفاده در usort

<?php
$users = [
    ["name" => "علی", "age" => 25],
    ["name" => "مریم", "age" => 22],
    ["name" => "حسن", "age" => 30],
];

// مرتب‌سازی بر اساس سن
usort($users, function($a, $b) {
    return $a["age"] - $b["age"];
});

// با arrow function
usort($users, fn($a, $b) => $a["age"] - $b["age"]);
?>

call_user_func — فراخوانی callback

<?php
function process($callback, $data) {
    return $callback($data);
}

// با نام تابع
echo process("strtoupper", "hello");

// با anonymous
echo process(function($s) { return strrev($s); }, "hello");

// با arrow
echo process(fn($s) => ucfirst($s), "hello");
?>

is_callable — بررسی قابل‌فراخوانی بودن

<?php
$func = "strtoupper";
if (is_callable($func)) {
    echo $func("hello");  // HELLO
}
?>

مثال کاربردی — سیستم فیلتر

<?php
function filterItems($items, $criteria) {
    return array_filter($items, $criteria);
}

$numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];

$evens = filterItems($numbers, fn($n) => $n % 2 === 0);
$gt5 = filterItems($numbers, fn($n) => $n > 5);
$primes = filterItems($numbers, function($n) {
    if ($n < 2) return false;
    for ($i = 2; $i <= sqrt($n); $i++) {
        if ($n % $i === 0) return false;
    }
    return true;
});
?>

این مبحث بخشی از دوره آموزش کامل PHP است.

ابزارهای مرتبط