تعريف المرجع
المرجع هو طريقة مبسطة للإشارة إلى محتوى متغير ( PHP Variables ) باستخدام اسم آخر. ويمكن تشبيه المرج بـ Shortcut في الويندوز. عندما تقوم بعمل مرجع لشيئ فكأنما تعطي له اسم مستعار فقط . فإذا كان أحد الضباط يدعى ” أحمد ” يقوم بتنفيذ مهمة تحت اسم مستعار ” محمد ” , فإذا وردت أخبار بأن ” محمد ” قد استشهد فقد علمت أن ” أحمد ” هو من اسشهد لان الإسمان يشيران إلى نفس الشخص. هكذا المراجع في PHP.
التخصيص بالمرجعية Assigning By Referenceاحدى طرق عمل المراجع هي التخصيص بالمرجعية بحيث يتم تخصيص قيمة متغير إلى متغير آخر مع إضافة علامة ( & ) قبل اسم المتغير المرجع بحيث يصبح المتغير الجديد مرجع للقديم ويشير الإثنان إلى نفس القيمة . بحيث إذا تغيرت قيمة أحدهما تتغير قيمة الثاني تلقائياً. لفهم ذلك سنقوم بعملية تخصيص عادية ( بدون مرجع )
أنظر الكود التالي
<?php $var = "Hi There"; $anotherVar= $var; $anotherVar= "See You Later"; echo $var; // "Hi There" تكون النتيجة echo '<br>'; echo $anotherVar; // "See You Later" تكون النتيجة ?>
شرح الكود
1 – قمنا بعمل متغير var$ وخصصنا له القيمة ” Hi There “.
2 – ثم خصصنا قيمة المتغير var$ لمتغير آخر anotherVar$ . بهذا قد قمنا بنسخ القيمة من المتغير الأول إلى المتغير الثاني وهذا يعني أنهما مازالا متغييرين منفصلين.
3 – ثم قمنا بتغيير القيمة التي تم تخزينها في المتغير anotherVar$ إلى ” See You later “.
4 – بما أن المتغيران المنفصلان تماماً فسيحتفظ المتغير var$ بقيمته الأصلية ” Hi There “. ويظهر ذلك في نتيجة الكود
[button title=”عرض نتيجة الكود” link=”https://makiomar.com/php_example/php_references/copy_variable.php” target=”_blank” size=”” color=”” class=””]
لكن في حالة التخصيص بالمرجعية سيتم تغيير قيمة المتغير إذا تم تغيير قيمة المرجع والعكس . لاحظ الكود التالي
<?php $var = "Hi There"; $anotherVar= &$var; $anotherVar= "See You Later"; echo $var; // "See You Later" تكون النتيجة echo '<br>'; echo $anotherVar; // "See You Later" تكون النتيجة ?>
لاحظ أنه تم عمل مرجع للمتغير باستخدام علامة ( & ) وبالتالي ستتغير قيم كل من المتغير ومرجعه في حالة تغيير أي منهما. أي أصبح المتغيران يشيران إلى نفس القيمة.
[button title=”عرض نتيجة الكود” link=”https://makiomar.com/php_example/php_references/assign_by_reference.php” target=”_blank” size=”” color=”” class=””]
إزالة مرجع Removing Referencesيتم حذف مرجع باستخدام الدالة ()unset بنفس الطريقة التي تحذف بها متغير عادي. وعند حذف مرجع فأنت تقوم بحذف المرجع فقط وليس قيته.
بمعنى أنه إذا تم عمل مرجع لمتغير ما, ثم قمت بتغيير قيمت المرجع فمن المعروف أن قيمة المتغير الأصلي ستتغير. وإذا قمت بحذف المرجع فسيحتفظ المتغير الأصلي بنفس القيمة التي نتجت عن تغيير قيمة المرجع.
<?php $var = "Hi There"; $anotherVar= &$var; $anotherVar= "See You Later"; unset ($anotherVar); echo $var; // "See You Later" تكون النتيجة ?>لن يتم إزالة القيمة من الذاكرة إلا إذا قمت بعمل ()unset للمتغير الأصلي أيضاً.
[button title=”عرض نتيجة الكود” link=”https://makiomar.com/php_example/php_references/unset_reference.php” target=”_blank” size=”” color=”” class=””]
استخدام كلمة Globalنعرف جميعاً أنه لا يمكن استخدام المتغيرات الشاملة ( Global Scope Variables ) داخل الدوال إلا باستخدام الكلمة global قبل اسم المتغير. وفي الحقية فنحن في هذه الحالة نستخدم التخصيص بالمرجعية , فكما نعرف أن المتغيرات الشاملة يتم تخزينها في المصفوفة GLOBALS$ وهي من المصفوفات الترابطية ( PHP Associative Array ).لذلك فإن :
<?php function myfunc(){ global $var; } ?>تكافئ التعبير التالي :
<?php function myfunc(){ $var = &$GLOBALS["var"] ; } ?>
مثال :
<?php $var1 = "Hello"; function testReference(){ $anotherVar = &$GLOBALS["var1"] ; $anotherVar .= " World"; return $GLOBALS["var1"].'<br>'; } echo "Using reference: ".testReference(); $var2 = "Hello"; function testGlobal(){ global $var2; $var2 .= " World"; return $GLOBALS["var2"].'<br>'; } echo "Using global key word: ".testGlobal(); ?>شرح اكود :
في المثال السابق قمنا ببناء دالتين للتلاعب بقيمة متغير تم تعريفه في مجال الرؤية العام Global، أحدهما تستخدم المرجع وأخرى تستخدم الكلمة global
1 – قمنا بتعريف متغير var1 وخصصنا له القيمة ” Hello “.
2 – في السطر رقم 3 قمنا بتعريف الدالة ()testReference
3 – قمنا في السطر رقم 4 بتعريف متغير anotherVar$ وخصصنا له مرجع للمتغير var1 عن طريق المتغير GLOBALS$
4 – قمنا في السطر رقم 5 بدمج سلسلة نصية ( String Variables ) باستخدام ( String Concatenation ) لإضافة الكلمة ” World “.
5 – الآن تغيرت قيمة المتغير anotherVar$ إلى ” Hello World “. وبما أنه مرجع لقيمة المتغير var1, وبالتالي اصبح هو الآخر له نفس القيمة.
6 – في السطر رقم 6 نطلب طباعة المتغير var1 عن طريق جلب قيمته داخل المصفوفة GLOBALS$.
7 – في السطر رقم 8 قمنا باستدعاء الدالة والتي ستقوم بطباعة قيمة المتغير var1 وهي ” Hello World “.
8- ثم قمنا بتعريف متغير var2 وخصصنا له القيمة ” Hello “.
9- في السطر رقم 11 قمنا بتعريف الدالة ()testGlobal
10- قمنا باستدعاء المتغير var2 عن طريق الكلمة global
11- قمنا في السطر رقم 13 بدمج سلسلة نصية ( String Variables ) باستخدام ( String Concatenation ) لإضافة الكلمة ” World “.
12- في السطر رقم 14 نطلب طباعة المتغير var2 عن طريق جلب قيمته داخل المصفوفة GLOBALS$.
13- في السطر رقم 16 قمنا باستدعاء الدالة والتي ستقوم بطباعة قيمة المتغير var2 وهي ” Hello World “.
[button title=”عرض نتيجة الكود” link=”https://makiomar.com/php_example/php_references/global_variable.php” target=”_blank” size=”” color=”” class=””]
هناك استخدامات أخرى للمراجع يمكنك التعرف عليها كالآتي :
1 – تمرير القيم للدوال بالمرجعية ( Passing By reference )
2- استعادة المراجع من الدوال ( Returning References )
ولمزيد من المراجع الخاصة بالكائنات PHP Object يمكنك قراءة PHP cloning objects