التمرير بالمرجع
جزء من قسم Logic & Flow في رحلة PHP على Coddy — الدرس 7 من 68.
بشكل افتراضي، عندما تقوم بتمرير متغير إلى دالة في PHP، تستلم الدالة نسخة من قيمة ذلك المتغير. وهذا يعني أن أي تغييرات يتم إجراؤها داخل الدالة لا تؤثر على المتغير الأصلي خارج الدالة.
ومع ذلك، في بعض الأحيان قد ترغب في أن تقوم الدالة بتعديل المتغير الأصلي مباشرةً. هنا يأتي دور التمرير بالمرجع (passing by reference). من خلال إضافة علامة العطف (&) قبل اسم المعامل في تعريف الدالة، فإنك تخبر PHP بتمرير المتغير الفعلي بدلاً من نسخة منه:
<?php
function doubleValue(&$number) {
$number = $number * 2;
}
$value = 10;
doubleValue($value);
echo $value; // المخرجات: 20
?>لاحظ كيف تغيرت $value من 10 إلى 20 على الرغم من أننا لم نقم بإرجاع أي شيء من الدالة. ينشئ المعامل &$number رابطاً مباشراً لمتغير $value الأصلي، مما يسمح للدالة بتعديله مباشرة.
هذه التقنية مفيدة بشكل خاص عندما تحتاج إلى دالة لتعديل متغيرات متعددة أو عند العمل مع هياكل بيانات كبيرة حيث يكون النسخ غير فعال.
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
التحدي
سهلأنشئ دالة تسمى updateInventory تأخذ ثلاث معاملات: مرجع لمتغير الكمية، والمبلغ المراد إضافته، والمبلغ المراد إزالته. يجب أن تقوم الدالة بتعديل الكمية الأصلية عن طريق إضافة المبلغ الأول وطرح المبلغ الثاني.
ستتلقى ثلاثة مدخلات: الكمية الأولية، والمبلغ المراد إضافته، والمبلغ المراد إزالته. اقرأ المدخلات الثلاثة، وأنشئ متغيراً بالكمية الأولية، واستدعِ الدالة updateInventory ممرراً الكمية بالمرجع (by reference) مع مبالغ الإضافة والإزالة، ثم اطبع الكمية المحدثة.
تنسيق المدخلات: ثلاثة أسطر - السطر الأول يحتوي على الكمية الأولية (رقم)، والسطر الثاني يحتوي على المبلغ المراد إضافته (رقم)، والسطر الثالث يحتوي على المبلغ المراد إزالته (رقم)
المخرجات المتوقعة: الكمية المحدثة بعد الإضافة والإزالة
ورقة مرجعية
بشكل افتراضي، تمرر PHP المتغيرات إلى الدوال بالقيمة (نسخة). لتعديل المتغير الأصلي، استخدم التمرير بالمرجع (pass by reference) عن طريق إضافة علامة العطف (&) قبل اسم المعامل:
<?php
function doubleValue(&$number) {
$number = $number * 2;
}
$value = 10;
doubleValue($value);
echo $value; // المخرجات: 20
?>ينشئ المعامل &$number رابطاً مباشراً بالمتغير الأصلي، مما يسمح للدالة بتعديله دون الحاجة لإرجاع قيمة. هذا مفيد لتعديل متغيرات متعددة أو العمل مع هياكل بيانات كبيرة بكفاءة.
جرّب بنفسك
<?php
// قراءة المدخلات
$initialQuantity = intval(fgets(STDIN));
$amountToAdd = intval(fgets(STDIN));
$amountToRemove = intval(fgets(STDIN));
// إنشاء متغير الكمية
$quantity = $initialQuantity;
// TODO: قم بإنشاء دالة updateInventory هنا التي تأخذ معاملًا بالمرجع
// TODO: استدعِ دالة updateInventory مع تمرير الكمية بالمرجع
// طباعة الكمية المحدثة
echo $quantity;
?>يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس Logic & Flow
1الدوال المتقدمة
الدوال المجهولةالـ Closures وكلمة 'use'دوال السهمدوال الـ Callbackاستخدام 'call_user_func'دوال المتغيراتالتمرير بالمرجعالدوال العوديةمراجعة: مزيج الدوال4المصفوفات متعددة الأبعاد
إنشاء مصفوفة ثنائية الأبعادالوصول إلى عناصر المصفوفة ثنائية الأبعادتعديل عناصر المصفوفة ثنائية الأبعادالتكرار باستخدام الحلقات المتداخلةالمصفوفات الترابطية ثنائية الأبعادمراجعة: تمرين الشبكة البسيطة2معالجة المصفوفات المتقدمة
الإضافة باستخدام 'array_push'الحذف باستخدام 'array_pop'الإضافة باستخدام 'array_unshift'الحذف باستخدام 'array_shift'دمج المصفوفات المفهرسةدمج المصفوفات الترابطيةالاستخراج باستخدام 'array_slice'القيم باستخدام 'in_array'المفاتيح باستخدام 'array_search'مراجعة: تمرين قائمة التشغيل3ترتيب المصفوفات
ترتيب المصفوفات المفهرسة تصاعدياًترتيب المصفوفات المفهرسة تنازلياًترتيب المصفوفات الترابطية حسب القيمةترتيب المصفوفات الترابطية حسب المفتاحالترتيب بالترتيب الطبيعيالترتيب المخصص باستخدام 'usort'مراجعة: ترتيب لوحة المتصدرين