⚡ درس سوم: برنامهنویسی تابعی در PHP؛ کدنویسی تمیز و بیانگر
🎯 هدف این درس: آشنایی با مفاهیم برنامهنویسی تابعی (Functional Programming) در PHP، استفاده از توابع ناشناس (Closures)، Arrow Functions و توابع مرتبه بالا مثل Map، Filter و Reduce برای پردازش دادهها به شکلی مدرن و خوانا.
مهمان عزیز! 👋
تا اینجا بیشتر با شیگرایی (OOP) کار کردهایم. اما PHP یک زبان هیبریدی است و قابلیتهای قدرتمندی در حوزه برنامهنویسی تابعی دارد.
برنامهنویسی تابعی بر پایه توابع خالص (Pure Functions) و عدم تغییر دادهها (Immutability) استوار است. این سبک کدنویسی باعث میشود کدهای شما کوتاهتر، قابل پیشبینیتر و راحتتر برای دیباگ باشند.
💡 چرا برنامهنویسی تابعی؟
۱. حذف حلقههای پیچیده foreach و جایگزینی با توابع بیانگر.
۲. کاهش باگهای ناشی از تغییر وضعیت متغیرها (Side Effects).
۳. کدهای کوتاهتر و خواناتر برای پردازش آرایهها.
1️⃣ توابع ناشناس و Arrow Functions
در PHP مدرن، میتوانیم توابع را بدون نام تعریف کنیم و آنها را به عنوان آرگومان به توابع دیگر بفرستیم. با معرفی Arrow Functions در PHP 7.4، این کار بسیار سادهتر شده است.
closures.php
PHP
8.x
// روش قدیمی با Closure
$greet = function ($name) {
return "Hello, $name";
};
// روش مدرن با Arrow Function (PHP 7.4+)
$greet = $name => "Hello, $name";
echo $greet('Younes'); // خروجی: Hello, Younes
2️⃣ تابع Map (نگاشت)
وقتی میخواهیم یک تغییر روی تمام اعضای یک آرایه اعمال کنیم (مثلاً دو برابر کردن قیمتها)، به جای حلقه foreach از array_map استفاده میکنیم.
map_example.php
PHP
8.x
$prices = [100, 200, 300];
// افزایش ۱۰ درصدی قیمتها
$newPrices = array_map(
$fn => $fn * 1.1,
$prices
);
// خروجی: [110, 220, 330]
3️⃣ تابع Filter (فیلتر)
برای حذف موارد ناخواسته از یک آرایه، از array_filter استفاده میکنیم. این تابع فقط عناصری را نگه میدارد که شرط داخل تابع را تأیید کنند.
filter_example.php
PHP
8.x
$ages = [12, 25, 40, 17, 30];
// فقط افراد بالای ۱۸ سال
$adults = array_filter(
$ages,
$fn => $fn >= 18
);
// خروجی: [25, 40, 30]
4️⃣ تابع Reduce (کاهش)
این تابع تمام عناصر آرایه را به یک مقدار واحد تبدیل میکند (مثل جمع کل فاکتور).
reduce_example.php
PHP
8.x
$numbers = [1, 2, 3, 4, 5];
// محاسبه مجموع اعداد
$sum = array_reduce(
$numbers,
$fn => $fn[0] + $fn[1],
0
);
// خروجی: 15
❌ خطاهای رایج در برنامهنویسی تابعی
🚫 اشتباه رایج:
استفاده بیش از حد از توابع تو در تو (Nested Functions) که باعث کاهش خوانایی کد میشود. گاهی اوقات یک حلقه ساده foreach خواناتر از چندین array_map تو در تو است.
- نادیده گرفتن Immutability: سعی کنید آرایه اصلی را تغییر ندهید و نتیجه را در متغیر جدید ذخیره کنید.
- پیچیدگی بیدلیل: هدف نهایی کد تمیز است، نه لزوماً کد تابعی. تعادل را حفظ کنید.
🏁 جمعبندی درس سوم
مهمان عزیز، در این درس یاد گرفتی:
- ✅ نحوه تعریف توابع ناشناس و Arrow Functions.
- ✅ استفاده از
array_mapبرای تغییر دادهها. - ✅ استفاده از
array_filterبرای غربالگری دادهها. - ✅ استفاده از
array_reduceبرای تجمیع دادهها.
🎓 تمرین عملی درس سوم
یک آرایه از محصولات (شامل نام و قیمت) داری. با استفاده از ترکیب filter و map، فقط محصولاتی که قیمتشان بالای ۵۰۰ هزار تومان است را پیدا کن و نام آنها را در یک آرایه جدید ذخیره کن.
🗺️ نقشه راه دوره: شما اینجا هستید!
برای اینکه بدانی دقیقاً کجای مسیر هستی و چه درسهایی در انتظار توست، به جدول زیر نگاه کن. درس فعلی با رنگ متفاوت مشخص شده است.
| درس | عنوان درس | آنچه یاد میگیرید |
|---|---|---|
| ۱ | اصول SOLID در PHP | تکمسئولیتی، باز/بسته، جایگزینی لیسکوف، جداسازی رابط، وارونگی وابستگی |
| ۲ | الگوهای طراحی (Design Patterns) | Singleton, Factory, Strategy, Observer, MVC پیشرفته |
| ۳ | برنامهنویسی تابعی در PHP | توابع ناشناس (Closures)، Arrow Functions، Map/Filter/Reduce |
| ۴ | مدیریت وابستگی با Composer | نصب پکیجها، مدیریت نسخهها، Autoloading (PSR-4) |
| ۵ | تستنویسی حرفهای (TDD) | آشنایی با PHPUnit، نوشتن Unit Test، Mocking |
| ۶ | کار با Redis و Caching | کش کردن دادهها، Session Handler با Redis |
| ۷ | پردازشهای پسزمینه (Queue & Jobs) | استفاده از صفها برای ایمیلزنی یا پردازش سنگین |
| ۸ | API نویسی حرفهای (RESTful) | استانداردهای REST، احراز هویت با JWT، Rate Limiting |
| ۹ | امنیت سایبری پیشرفته | تحلیل حملات پیچیده، Secure Headers، CSP |
| ۱۰ | پروژه نهایی پیشرفته | ساخت یک CMS ماژولار با قابلیت نصب پلاگین و تم |



