توابع بینام (Anonymous Functions) - آزمون آنلاین پی اچ پی php
آشنایی با توابع بینام (Anonymous Functions)
اول از همه بریم سراغ یکی از کاربردی ترین ویژگیهای PHP، یعنی توابع بینام یا Anonymous Functions. این توابع همونطور که از اسمشون پیداست، اسمی ندارن و معمولا به عنوان آرگومان به توابع دیگه پاس داده میشن.
مثلا وقتی میخوای یه کار خاص رو روی هر کدوم از اعضای یه آرایه انجام بدی و نمیخوای یه تابع جداگانه براش تعریف کنی، این توابع حسابی به دردت میخورن.
یکی از جاهایی که خیلی ازشون استفاده میکنیم، توابع مثل array_map یا array_filter هست. مثلا فرض کن یه آرایه از اعداد داری و میخوای همه رو دو برابر کنی.

به جای اینکه یه تابع جدا بنویسی و بعد صداش کنی، میتونی همونجا یه تابع بینام بنویسی و کار رو تموم کنی. خیلی باحاله، نه؟
$numbers = [1, 2, 3, 4, 5];
$doubled_numbers = array_map(function($n) {
return $n * 2;
}, $numbers);
print_r($doubled_numbers);
کاربرد Closures
حالا که با توابع بینام آشنا شدی، بریم سراغ Closures. میشه گفت Closures در واقع همون توابع بینام هستن، با یه تفاوت اساسی: میتونن به متغیرهای خارج از خودشون دسترسی داشته باشن.
این قابلیت واقعا معجزهآساست و تو رو از دردسر پاس دادن متغیرهای اضافی نجات میده. مثلا فرض کن میخوای یه تابع بنویسی که اعداد یه آرایه رو با یه عدد مشخص جمع کنه. اون عدد مشخص رو میتونی با کلمه کلیدی use بهش پاس بدی.
$factor = 10;
$add_factor = function($n) use ($factor) {
return $n + $factor;
};
$numbers = [1, 2, 3, 4, 5];
$new_numbers = array_map($add_factor, $numbers);
print_r($new_numbers);
همونطور که دیدی، تونستیم متغیر $factor رو داخل تابع بیناممون استفاده کنیم. این قابلیت رو Closures به ما میده.
بیا یه مثال دیگه بزنم تا حسابی جا بیفته:
- استفاده در توابع مرتبسازی: برای مرتبسازی آرایهها با
usortمیتونی از Closures استفاده کنی تا نحوه مرتبسازی رو بر اساس متغیرهای خارج از تابع تعیین کنی. - ایجاد توابع کارخانهای: میتونی تابعی بنویسی که خودش یک Closure رو برگردونه. این مدل برنامهنویسی بهت انعطاف خیلی زیادی میده.
مفهوم توابع بازگشتی (Recursive Functions)
رسیدیم به یکی از شیرینترین و در عین حال چالشبرانگیزترین مباحث، توابع بازگشتی. به زبان ساده، تابع بازگشتی تابعیه که خودش رو صدا میزنه.
این توابع برای حل مسائل تکراری که میشه اونها رو به مسائل کوچکتر تقسیم کرد، مثل پیمایش درختها یا محاسبه فاکتوریل، عالی هستن.
اگه میخوای درک کنی چطور کار میکنن، به دو نکته اساسی توجه کن:
- حالت پایه (Base Case): این همون شرطیه که تابع رو از صدا زدن خودش متوقف میکنه. اگه این شرط نباشه، تابع تا بینهایت ادامه پیدا میکنه و به ارور Stack Overflow میخوری.
- فراخوانی بازگشتی (Recursive Call): همونجایی که تابع خودش رو دوباره صدا میزنه ولی این بار با دادههای کوچکتر.
بیاید یه مثال ساده از محاسبه فاکتوریل رو ببینیم:
function factorial($n) {
// حالت پایه
if ($n <= 1) {
return 1;
}
// فراخوانی بازگشتی
return $n * factorial($n - 1);
}
echo factorial(5); // نتیجه: 120
جدول مقایسه
حالا برای اینکه قشنگ تفاوت این سه تا رو بفهمی، یه جدول مقایسه برات آماده کردم. این جدول بهت کمک میکنه تو ذهنت دستهبندی درستی از هر کدوم داشته باشی.
| ویژگی | Anonymous Function | Closure | Recursive Function |
|---|---|---|---|
| اسم | ندارد | ندارد | دارد |
| دسترسی به متغیرهای بیرونی | ندارد | دارد (با استفاده از use) |
دارد (معمولی) |
| کاربرد اصلی | پاس دادن به توابع دیگر | دسترسی به Scope بیرونی | حل مسائل تکراری |
با این اطلاعاتی که بهت دادم، الان میتونی با خیال راحت در آزمون مربوط به این مباحث شرکت کنی و مطمئن باشی که به بیشتر سوالها جواب میدی. این آزمون بهت نشون میده که درک درستی از این مفاهیم کلیدی داری و میتونی کدنویسی حرفهایتری داشته باشی.