التمرير بالمرجع
جزء من قسم المنطق وتدفق التنفيذ في رحلة PHP على Coddy. الدرس 7 من 68.
بشكل افتراضي، عند تمرير variable إلى function في PHP، تستلم function نسخة من قيمة ذلك variable. وهذا يعني أن أي تغييرات تُجرى داخل function لا تؤثر في variable الأصلي خارج function.
ومع ذلك، قد ترغب أحيانًا في أن تقوم function بتعديل variable الأصلية مباشرةً. وهنا يأتي دور التمرير بالمرجع. من خلال إضافة علامة (&) قبل اسم parameter في تعريف function، فإنك تخبر PHP بتمرير variable الفعلية بدلًا من نسخة منها:
<?php
function doubleValue(&$number) {
$number = $number * 2;
}
$value = 10;
doubleValue($value);
echo $value; // المخرجات: 20
?>لاحظ كيف تغيّرت قيمة $value من 10 إلى 20، رغم أننا لم نُرجع أي شيء من الدالة. ينشئ المُعامل &$number رابطًا مباشرًا إلى المتغيّر الأصلي $value، مما يسمح للدالة بتعديله مباشرةً.
تكون هذه التقنية مفيدة بشكل خاص عندما تحتاج إلى أن تعدّل دالةٌ عدةَ متغيرات أو عندما تتعامل مع هياكل بيانات كبيرة، حيث يكون النسخ غير فعّال.
التحدي
سهلأنشئ function تُسمّى updateInventory وتأخذ ثلاثة parameter: reference إلى quantity variable، ومقدارًا للإضافة، ومقدارًا للإزالة. يجب أن تعدّل function القيمة الأصلية لـ quantity بإضافة المقدار الأول وطرح المقدار الثاني.
ستتلقى ثلاثة inputs: quantity الأولية، ومقدار الإضافة، ومقدار الإزالة. اقرأ inputs الثلاثة، وأنشئ variable بالقيمة الأولية لـ quantity، واستدعِ function updateInventory مع تمرير quantity باستخدام reference، بالإضافة إلى مقداري add وremove، ثم اطبع quantity المحدّثة.
تنسيق الإدخال: ثلاثة أسطر - يحتوي السطر الأول على quantity الأولية (number)، ويحتوي السطر الثاني على مقدار الإضافة (number)، ويحتوي السطر الثالث على مقدار الإزالة (number)
الناتج المتوقع: quantity المحدّثة بعد الإضافة والإزالة
جرّب بنفسك
<?php
// اقرأ المدخلات
$initialQuantity = intval(fgets(STDIN));
$amountToAdd = intval(fgets(STDIN));
$amountToRemove = intval(fgets(STDIN));
// أنشئ متغير quantity
$quantity = $initialQuantity;
// TODO: أنشئ دالة updateInventory هنا التي تأخذ معاملًا مرجعيًا
// TODO: استدعِ دالة updateInventory مع quantity بالمرجع
// أخرج quantity المحدثة
echo $quantity;
?>يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس المنطق وتدفق التنفيذ
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'مراجعة: ترتيب لوحة المتصدرينتدرّب بنفسك: مترجم PHP عبر الإنترنت