اذهب الي المحتوي
أوفيسنا

تمرير الوسائط إلى الدوال بالمرجعية Passing arguments by reference


mennad sofiane

الردود الموصى بها

If-Statement.pngPassing-arguments-by-reference.jpg

نعلم جميعاً أن لكل متغير مجال محدد ( PHP VARIABLE SCOPES ) ولا يمكن استخدام المتغير إلا في نطاقه, ونعرف أن المتغيرات الشاملة ( PHP GLOBAL VARIABLES ) لا يمكن استخدامها داخل الدوال إلا باستخدام كلمة global . لكن ماذا إذا أردت استخدام المتغيرات الشاملة كوسيط لدالة function argumentt .

يمكن تمرير المتغيرات الشاملة كوسائط للدوال باستخدام مرجع reference للمتغير وليس استخدام المتغير نفسه عن طريق وضع علامة & قبل وسائط الدالة.

كما تعلم أنه يمكن تمرير قيم الوسائط للدالة ( php passing arguments by value ) وهذه الطريقة تستخدم الوسائط دون تغيير قيمتها الأصلية

أنظر الكود التالي

5a8f0c4c3a64a_.JPG.b3db23cbcfc536a2beb714708a67ee96.JPG

شرح الكود :

1- في السطر رقم 2 قمنا بتعريف الدالة fix_names ومررنا إليها المتغيرات n1,n2,n3

2- في السطر رقم 3,4,5 قمنا بتطبيق الدالة ( PHP UCFIRST )  التي ستقوم بتحويل الأحرف الأولى لقيم المتغيرات إلى أحرف كبيرة.

3- في السطر رقم 6 طلبنا طباعة قيم المتغيرات بعد التحويل.

4- في السطر رقم 8,9,10 قمنا بتعريف المتغيرات a1,a2,a3 .

5- ثم في السطر رقم 11 قمنا بتطبيق الدالة fix_names على هذه المتغيرات, فيتم طباعة المتغيرات مع تغيير الأحرف الأولى لها .

6- أما في اسطر رقم 13 قمنا بطباعة المتغيرات a1,a2,a3 فتكون النتيجة هي القيم الأصلية دون تغيير.

بالتالي تمرير قيم الوسائط إلى الدوال يحافظ على قيم الوسائط دون تغيير , على عكس تمرير الوسائط بالمرجعية ( Passing By reference )

أنظر الكود التالي 

5a8f0cae57aa7_.JPG.39a59afd1f1bf0229799c28a861ef9c2.JPG

شرح الكود

1- في السطر رقم 2 قمنا بإنشاء دالة ( PHP FUNCTIONS ) وهي fix_names باستخدام الوسائط arguments وهي n1, n2,n3 بالإضافة إلى وضع & قبل كل وسيط. هذه الدالة تقوم بتحويل الحرف الأول لأي متغير من النوع string  إلى حرف كبير Capital letter باستخدام الدالة مسبقة الإعداد في بي إتش بي ( PHP UCFIRST ).

2- ثم في السطر رقم 8,9,10 قمنا بتعريف ثلاثة متغيرات a1 , a2, a3 لتنفيذ الدالة fix_names عليهم

3- ثم في السطر رقم 11 قمنا باستدعاء الدالة fix_names وتم تمرير الثلاثة متغيرات كوسائط لهذه الدالة, فقامت الدالة بتحويل الحرف الأول ولكن حتى هذه اللحظة لن يتم طباعة النتيجة  لأننا لم نطلب الطباعة داخل الدالة في الأساس.

4- ثم في السطر رقم 12 طلبنا طباعة المتغيرات الثلاث باستخدام echo , فكانت النتيجة واحدة مما يوضح أن تمرير الوسائط للدوال بالمرجعية يقوم بتغيير القيمة الأصلية لها على عكس تمرير قيم الوسائط.

5a8f0d24d0110_.JPG.f45f9522c5ddf75265a7dc68fc6e9176.JPG

أيضاً من الاستخدامات المفيدة لتمرير الماغيرات بالمرجعية, هو استخدامها مع جملة ( PHP Foreach As ).

فكما نعلم أن جملة foreach as تقوم بعمل التكرار الحلقي على قيم المصفوفات بحيث يتم تخصيص كل قيمة لمتغير ثم الاستفادة من هذا المتغير فيما بعد, لكن دون التأثير على القيم الأصلية داخل المصفوفة.

ماذا إن أردت تغيير القيم الأصلية للمصفوفة عند استخدام foreach as ؟

نعلم جميعاً أن جملة foreach as تكتب بهذه الصيغة :

5a8f0dc20224c_.JPG.db32404ddeee5ee75aca940044de543e.JPG

الآن إذا أردنا تغيير القيم الأصلية للمصفوفة يجب علينا تمرير القيم بالمرجعية عن طريقة إضافة علام ( & ) قبل value$ كما يظهر في الصيغة التالية :

5a8f0d5e51b77_.JPG.9f7ab6ac6f10d3e0fca37cf06a950db5.JPG

لتوضيح الفكرة سنقوم بعمل مصفوفة لمجموعة من الأسماء تبدأ بالأحرف الكبيرة ثم سنمرر هذه الاسماء بالمرجعية إلى جملة foreach as لتحويل حالة جميع الأحرف إلى الأحرف الكبيرة

 

5a8f0e06b041b_.JPG.4379187acbd1dfa81473b20020c05eae.JPG

الأن عن إضافة علامة ( & ) إلى القيمة عند كتابة جملة foreach as سيتم عمل مرجع ( Reference ) للقيم الأصلية داخل المصفوفة , وبالتالي عند تطبيق الدالة ()strtoupper سيتم تحويل حالة جميع الأحرف إلى أحرف كبيرة.

5a8f0e74b697b_.JPG.8bf15fad8ee80a907a693fdd43cad502.JPG

5a8f0ebbb335c_.JPG.13269eff886c25890466714cbc7c2968.JPG

تحميل الملف : 

foreach_pass_by_reference.zip

 
  • Like 3
رابط هذا التعليق
شارك

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

زائر
اضف رد علي هذا الموضوع....

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

  • تصفح هذا الموضوع مؤخراً   0 اعضاء متواجدين الان

    • لايوجد اعضاء مسجلون يتصفحون هذه الصفحه
×
×
  • اضف...

Important Information