20- شرح PHP Functions متقدم

🧩 أنواع الدوال في PHP
الدوال المعرفة مسبقًا (Built-in Functions)

الدوال المعرفة من قبل المستخدم (User-defined Functions)

الدوال المجهولة (Anonymous Functions / Closures)

الدوال السهمية (Arrow Functions)

الدوال القابلة للنداء (Callable Functions)

✍️ إنشاء [شركة برمجة مصرية] دالة [شركة برمجة مصرية] بسيطة (للمراجعة السريعة)

<?php
function sayHello($name) {
    return "Hello, $name!";
}

echo sayHello("Ahmed"); // Hello, Ahmed!
?>

🔁 الدوال العودية (Recursive Functions)
الدالة التي تستدعي نفسها. مثال لحساب المضروب:

<?php
function factorial($n) {
    if ($n <= 1) return 1;
    return $n * factorial($n - 1);
}

echo factorial(5); // 120
?>

🕳️ الدوال المجهولة (Closures) واستخدامها مع array_map / array_filter

<?php
$numbers = [1, 2, 3, 4, 5];

$squared = array_map(function($n) {
    return $n * $n;
}, $numbers);

print_r($squared);
// [1, 4, 9, 16, 25]
?>

🏹 الدوال السهمية (Arrow Functions)
تم تقديمها في PHP 7.4 وتُستخدم لكتابة دوال مختصرة:

<?php
$numbers = [1, 2, 3];
$doubled = array_map(fn($n) => $n * 2, $numbers);

print_r($doubled);
// [2, 4, 6]
?>

✅ الفرق الرئيسي أن fn() تستخدم الربط التلقائي للمتغيرات الخارجية (lexical scoping) دون الحاجة لكلمة use.

🧠 تمرير الدوال كـ Callback (الدوال القابلة للنداء)

<?php
function process($arr, callable $callback) {
    foreach ($arr as $item) {
        echo $callback($item) . PHP_EOL;
    }
}

process([1, 2, 3], function($n) {
    return $n * 10;
});
?>

📦 استخدام Closures مع المتغيرات الخارجية

<?php
function counter() {
    $count = 0;
    return function() use (&$count) {
        return ++$count;
    };
}

$next = counter();
echo $next(); // 1
echo $next(); // 2
?>

🧬 الدوال المتعددة الوسائط (Variadic Functions)
تتيح لك استقبال عدد غير معروف من المعطيات:

<?php
function sumAll(...$nums) {
    return array_sum($nums);
}

echo sumAll(1, 2, 3, 4); // 10
?>

🛡️ التحقق من نوع المتغيرات (Type Hinting) والعودة (Return Type)

<?php
function multiply(float $a, float $b): float {
    return $a * $b;
}

echo multiply(2.5, 4); // 10
?>

🧰 استخدام دوال كـ Strategy Design Pattern

<?php
function calculate($a, $b, callable $operation) {
    return $operation($a, $b);
}

$add = fn($x, $y) => $x + $y;
$sub = fn($x, $y) => $x - $y;

echo calculate(10, 5, $add); // 15
echo calculate(10, 5, $sub); // 5
?>

🧪 اختبار دوالك بطريقة ديناميكية (Dynamic Function Invocation)

<?php
function greet($name) {
    return "Welcome $name!";
}

$func = "greet";
echo $func("Sara"); // Welcome Sara!
?>

💡 نصائح عملية عند استخدام الدوال
اجعل الدوال تؤدي مهمة واحدة فقط (Single Responsibility).

لا تكتب دوال ضخمة – قسم المهام الكبيرة إلى دوال صغيرة.

استخدم التوثيق الجيد داخل التعليقات (/** */) لفهم الدوال بسهولة.

جرّب جعل دوالك “pure” أي أنها لا تعتمد على متغيرات خارجية ولا تغيّرها.

📌 خلاصة
الدوال في PHP أكثر من مجرد أدوات لتقسيم الكود – إنها طريقة تفكير برمجية. باستخدام المفاهيم المتقدمة مثل الإغلاق، الأنماط، والدوال القابلة للنداء، يمكنك بناء تطبيقات قوية، قابلة للتوسعة، وصيانتها أسهل.

🧠 كلما أتقنت استخدام الدوال بذكاء، كلما أصبح كودك أنظف وأكثر احترافية.