We are still cooking the magic in the way!
أساسيات PHP
الدوال في PHP
الدوال في PHP
الدوال هي كتل قابلة لإعادة الاستخدام من الكود تؤدي مهام محددة. تساعد في تنظيم الكود وتحسين قابلية القراءة ومنع التكرار. الدوال أساسية لكتابة تطبيقات PHP قابلة للصيانة وفعالة.
تعريف الدوال
استخدم الكلمة الأساسية function لتعريف دالة:
<?php
// تعريف دالة أساسية:
function greet() {
echo "مرحباً بالعالم!";
}
// استدعاء الدالة:
greet(); // الناتج: مرحباً بالعالم!
// دالة مع عبارات متعددة:
function displayInfo() {
echo "هذا هو السطر 1<br>";
echo "هذا هو السطر 2<br>";
echo "هذا هو السطر 3<br>";
}
displayInfo();
?>
ملاحظة: أسماء الدوال غير حساسة لحالة الأحرف في PHP.
()greet و ()Greet و ()GREET كلها تشير إلى نفس الدالة. ومع ذلك، من الأفضل استخدام اصطلاحات تسمية متسقة.
معاملات الدالة
تسمح لك المعاملات بتمرير البيانات إلى الدوال:
<?php
// دالة مع معامل واحد:
function greet($name) {
echo "مرحباً، $name!";
}
greet("أحمد"); // الناتج: مرحباً، أحمد!
greet("فاطمة"); // الناتج: مرحباً، فاطمة!
// دالة مع معاملات متعددة:
function add($a, $b) {
echo $a + $b;
}
add(5, 3); // الناتج: 8
// دالة مع معاملات كثيرة:
function createUser($name, $email, $age, $city) {
echo "المستخدم: $name، البريد: $email، العمر: $age، المدينة: $city";
}
createUser("أحمد", "ahmad@example.com", 30, "الرياض");
?>
قيم المعاملات الافتراضية
يمكنك تحديد قيم افتراضية للمعاملات:
<?php
// قيم معاملات افتراضية:
function greet($name = "ضيف") {
echo "مرحباً، $name!";
}
greet(); // الناتج: مرحباً، ضيف!
greet("أحمد"); // الناتج: مرحباً، أحمد!
// قيم افتراضية متعددة:
function createPost($title, $status = "مسودة", $featured = false) {
echo "العنوان: $title، الحالة: $status، مميز: " .
($featured ? "نعم" : "لا");
}
createPost("مشاركتي"); // يستخدم القيم الافتراضية للحالة والمميز
createPost("مشاركتي", "منشور"); // يستخدم القيمة الافتراضية للمميز
createPost("مشاركتي", "منشور", true); // لا توجد قيم افتراضية
?>
نصيحة: يجب وضع المعاملات ذات القيم الافتراضية بعد المعاملات بدون قيم افتراضية. هذا يمنع الأخطاء ويجعل استدعاءات دالتك أكثر سهولة.
قيم الإرجاع
يمكن للدوال إرجاع القيم باستخدام عبارة return:
<?php
// دالة تُرجع قيمة:
function add($a, $b) {
return $a + $b;
}
$result = add(5, 3);
echo $result; // الناتج: 8
// استخدام قيمة الإرجاع مباشرة:
echo add(10, 20); // الناتج: 30
// دالة مع نقاط إرجاع متعددة:
function getGrade($score) {
if ($score >= 90) return "ممتاز";
if ($score >= 80) return "جيد جداً";
if ($score >= 70) return "جيد";
if ($score >= 60) return "مقبول";
return "راسب";
}
echo getGrade(85); // الناتج: جيد جداً
// إرجاع المصفوفات:
function getUser() {
return [
'name' => 'أحمد',
'email' => 'ahmad@example.com',
'age' => 30
];
}
$user = getUser();
echo $user['name']; // الناتج: أحمد
?>
ملاحظة: عند تنفيذ عبارة return، تخرج الدالة على الفور. أي كود بعد عبارة return لن يتم تنفيذه.
إعلانات الأنواع
تسمح لك PHP بتحديد أنواع المعاملات وأنواع الإرجاع (PHP 7.0+):
<?php
// إعلانات نوع المعامل:
function add(int $a, int $b) {
return $a + $b;
}
echo add(5, 3); // الناتج: 8
// add("5", "3"); // يعمل: يتم تحويل السلاسل إلى أعداد صحيحة
// إعلان نوع الإرجاع:
function multiply(int $a, int $b): int {
return $a * $b;
}
// أنواع متعددة مع أنواع الاتحاد (PHP 8.0+):
function display(string|int $value): void {
echo $value;
}
// الأنواع القابلة للإلغاء:
function findUser(int $id): ?array {
// يرجع مصفوفة أو null
return null; // لم يتم العثور على مستخدم
}
?>
التمرير بالمرجع
بشكل افتراضي، يتم تمرير الوسائط بالقيمة. استخدم & للتمرير بالمرجع:
<?php
// التمرير بالقيمة (افتراضي):
function incrementValue($num) {
$num++;
echo "داخل: $num<br>";
}
$x = 5;
incrementValue($x);
echo "خارج: $x"; // الناتج: 5 (دون تغيير)
// التمرير بالمرجع:
function incrementReference(&$num) {
$num++;
echo "داخل: $num<br>";
}
$y = 5;
incrementReference($y);
echo "خارج: $y"; // الناتج: 6 (تم التغيير)
?>
تحذير: استخدم التمرير بالمرجع بشكل محدود. يجعل الكود أصعب في الفهم والتصحيح. فضّل إرجاع القيم بدلاً من ذلك.
الدوال المتغيرة
تسمح لك PHP باستدعاء الدوال ديناميكياً باستخدام المتغيرات:
<?php
function sayHello() {
echo "مرحباً!";
}
function sayGoodbye() {
echo "وداعاً!";
}
// استدعاء الدالة باستخدام متغير:
$functionName = "sayHello";
$functionName(); // الناتج: مرحباً!
$functionName = "sayGoodbye";
$functionName(); // الناتج: وداعاً!
// مثال عملي:
$action = $_GET['action'] ?? 'default';
$allowedActions = ['create', 'update', 'delete'];
if (in_array($action, $allowedActions)) {
$functionName = $action . 'Post';
if (function_exists($functionName)) {
$functionName();
}
}
?>
الدوال المجهولة (الإغلاقات)
الدوال المجهولة ليس لها اسم ويمكن تخزينها في متغيرات:
<?php
// دالة مجهولة مخصصة لمتغير:
$greet = function($name) {
echo "مرحباً، $name!";
};
$greet("أحمد"); // الناتج: مرحباً، أحمد!
// دالة مجهولة كـ callback:
$numbers = [1, 2, 3, 4, 5];
$squared = array_map(function($n) {
return $n * $n;
}, $numbers);
print_r($squared); // [1, 4, 9, 16, 25]
// دالة مجهولة مع use():
$multiplier = 10;
$multiply = function($n) use ($multiplier) {
return $n * $multiplier;
};
echo $multiply(5); // الناتج: 50
?>
دوال السهم (PHP 7.4+)
توفر دوال السهم صيغة أقصر للدوال المجهولة البسيطة:
<?php
// دالة مجهولة تقليدية:
$numbers = [1, 2, 3, 4, 5];
$squared = array_map(function($n) {
return $n * $n;
}, $numbers);
// دالة سهم (أقصر):
$squared = array_map(fn($n) => $n * $n, $numbers);
// دوال السهم تلتقط المتغيرات تلقائياً:
$multiplier = 10;
$multiply = fn($n) => $n * $multiplier;
echo $multiply(5); // الناتج: 50
?>
نصيحة: دوال السهم رائعة للعمليات البسيطة من سطر واحد. للمنطق المعقد، استخدم الدوال المجهولة التقليدية أو الدوال المسماة.
أمثلة عملية
مثال 1: التحقق من الإدخال
<?php
function validateEmail($email) {
return filter_var($email, FILTER_VALIDATE_EMAIL) !== false;
}
function validateAge($age) {
return is_numeric($age) && $age >= 18 && $age <= 120;
}
function validateUsername($username) {
return strlen($username) >= 3 && strlen($username) <= 20;
}
// الاستخدام:
$email = "user@example.com";
if (validateEmail($email)) {
echo "بريد إلكتروني صالح";
} else {
echo "بريد إلكتروني غير صالح";
}
?>
مثال 2: تنسيق البيانات
<?php
function formatCurrency($amount, $currency = "ريال") {
return $currency . " " . number_format($amount, 2);
}
function formatDate($date, $format = "Y-m-d") {
return date($format, strtotime($date));
}
function slugify($text) {
$text = strtolower($text);
$text = preg_replace('/[^a-z0-9]+/', '-', $text);
return trim($text, '-');
}
// الاستخدام:
echo formatCurrency(1234.567); // ريال 1,234.57
echo formatDate("2024-12-25", "Y-m-d"); // 2024-12-25
echo slugify("مرحباً بالعالم!"); // مرحبا-بالعالم
?>
مثال 3: مساعدات المصفوفة
<?php
function arrayFirst($array) {
return count($array) > 0 ? $array[0] : null;
}
function arrayLast($array) {
return count($array) > 0 ? $array[count($array) - 1] : null;
}
function arrayPluck($array, $key) {
return array_map(fn($item) => $item[$key] ?? null, $array);
}
// الاستخدام:
$users = [
['name' => 'أحمد', 'age' => 30],
['name' => 'فاطمة', 'age' => 25],
['name' => 'محمد', 'age' => 35]
];
$names = arrayPluck($users, 'name');
print_r($names); // ['أحمد', 'فاطمة', 'محمد']
?>
أفضل ممارسات الدوال
1. مبدأ المسؤولية الواحدة
<?php
// سيء: الدالة تفعل أشياء كثيرة جداً
function processUser($data) {
// التحقق
// الحفظ في قاعدة البيانات
// إرسال بريد إلكتروني
// تسجيل النشاط
// تحديث ذاكرة التخزين المؤقت
}
// جيد: تقسيم إلى دوال مركزة
function validateUser($data) { }
function saveUser($data) { }
function sendWelcomeEmail($user) { }
function logUserActivity($user) { }
?>
2. تسمية وصفية
<?php
// سيء: أسماء غير واضحة
function calc($a, $b) { }
function process($d) { }
// جيد: أسماء واضحة ووصفية
function calculateTotalPrice($quantity, $unitPrice) { }
function processPayment($paymentData) { }
function getUserByEmail($email) { }
function isValidPassword($password) { }
?>
3. اجعل الدوال قصيرة
ملاحظة: اهدف إلى دوال تفعل شيئاً واحداً بشكل جيد. إذا تجاوزت الدالة 20-30 سطراً، فكر في تقسيمها إلى دوال أصغر.
أمثلة الدوال المدمجة
<?php
// التحقق من وجود دالة:
if (function_exists('myFunction')) {
myFunction();
}
// الحصول على قائمة الدوال المعرفة:
$functions = get_defined_functions();
// الحصول على وسائط الدالة:
function example($a, $b, $c = 10) {
$args = func_get_args();
print_r($args);
}
example(1, 2, 3); // [1, 2, 3]
// عدد الوسائط:
function example2() {
echo func_num_args();
}
example2(1, 2, 3, 4); // الناتج: 4
?>
تمرين تطبيقي
المهمة: إنشاء آلة حاسبة بسيطة مع الدوال:
- أنشئ دوال للجمع والطرح والضرب والقسمة
- يجب أن تأخذ كل دالة رقمين كمعاملات
- يجب أن تتحقق دالة القسمة من القسمة على صفر
- أنشئ دالة
calculate($operation, $a, $b)تستدعي العملية المناسبة - إضافة: أضف دوال للنسبة المئوية والأس والجذر التربيعي
- إضافي: أنشئ دالة
formatResult($result, $decimals = 2)لتنسيق الناتج - تحدي: أضف إعلانات نوع المعامل وأنواع الإرجاع لجميع الدوال
الأخطاء الشائعة التي يجب تجنبها
- لا تستخدم معاملات كثيرة جداً (أكثر من 4-5 يشير إلى الحاجة لإعادة الهيكلة)
- تجنب المتغيرات العامة داخل الدوال - مرر البيانات كمعاملات
- لا تعدّل المعاملات الممررة بالقيمة متوقعاً تغييرات خارجية
- تجنب الدوال ذات التأثيرات الجانبية غير الواضحة من الاسم
- لا تنشئ دوال ترجع أنواعاً مختلفة بناءً على الشروط
- تجنب المنطق المتداخل بعمق - استخرج إلى دوال مساعدة
الملخص
الدوال هي اللبنات الأساسية في برمجة PHP:
- استخدم الكلمة الأساسية
functionلتعريف كتل كود قابلة لإعادة الاستخدام - تسمح المعاملات بتمرير البيانات إلى الدوال
- استخدم
returnلإرسال القيم إلى المستدعي - توفر المعاملات الافتراضية المرونة
- تعمل إعلانات الأنواع على تحسين موثوقية الكود
- تمكّن الدوال المجهولة ودوال السهم البرمجة الوظيفية
- حافظ على الدوال مركزة وقصيرة وجيدة التسمية
- اتبع أفضل الممارسات للحصول على كود قابل للصيانة