من خصائص حدود الرؤية ( PHP Visibility ) أن الخصائص / الطرق الخاصة أو المحمية لايمكن لكائن مُشتق من الفئة الوصول إليها. لكن يمكنك التحايل على هذا الوضع من خلال تمرير الخصائص / الطرق المحمية والخاصة عبر دالة عامة داخل الفئة. وبالتالي الكائن المشتق من الفئة يمكن استخدام هذه الطريقة العامة والتي بدورها يمكنها الوصول للخصائص/ الطرق الخاصة والمحمية .
ويتم ذلك عن طريق عمل طريقة ( PHP Method ) ذات حدود رؤية ( PHP Visibility ) عامة ، وظيفتها التلاعب بالخصائص المحمية والخاصة ويطلق عليها دالة الإعداد set . ثم عمل طريقة أخرى ذات حدود رؤية عامة وظيفتها الحصول على القيم المحمية والخاصة ويُطلق عليها دالة التحصيل get . ثم عند إنشاء كائن جديد يتم استدعاء هذه الطرق بشكل طبيعي والتلاعب والحصول على القيم الخاصة والمحمية داخل الفئة. لاحظ الكود التالي
[highlight background=”” color=””] لا يُشترط استخدام الأسماء set and get فهي دوال يتم تعريفها بواسطة المبرمج وليست دوال مدمجة Built-in Functions [/highlight]
<?php class human{ // تعريف الخصائص protected $name; private $lastname; public $midname; // تعريف طريقة عامة تقبل الوسائط للتلاعب بخصائص الفئة public function setName($var1,$var2){ $this->name = $var1; $this->lastname = $var2; return; } private function midName(){ $this->midname = "Ibrahim"; return $this->midname; } // طريقة عامه يمكنها استخدام كل الخصائص /الطرق العامة والمحمية والخاصة public function getName(){ echo "My complete name is ". $this->name.' '.$this->midName().' '.$this->lastname; } } // إنشاء كائن جديد $Ahmed = new human(); $Ahmed->setName("Ahmed","Mahmoud"); $Ahmed->getName(); ?>شرح الكود :
في السطر رقم 4 قمنا بتعريف خاصية محمية name$ في السطر رقم 5 قمنا بتعريف خاصية خاصة lastname$ في السطر رقم 6 قمنا بتعريف خاصية عامة midname$ في السطر رقم 8 قمنا بتعريف طريقة عامة ()setName تقبل وسائط للتلاعب بقيم خصائص الفئة. وهذا طبيعي مادامت الطريقة داخل الفئة يمكنها استخدام كل الخصائص . في السطر رقم 13 قمنا بتعريف خاصية خاصة ()midName وظيفتها فقط تعريف قيمة الخاصية midname$ واسترجاع قيمتها ( PHP Returning Values ). في السطر قم 18 قمنا بتعريف طريقة عامة ()getName وظيفتها استخدام الخصائص / الطرق الموجودة بالفئة. بالتالي عند إنشاء كائن جديد فيمكنه الوصول للطرق العامة، وهذا ما حدث في السطر رقم 23 عندما أنشأنا كائن جديد Ahmed$ ثم استدعينا الطريقة العامة ()setName مع تمرير الوسائط التي بدورها تستطيع تغيير الخصائص الخاصة والمحمية للفئة، وبالتالي ستتغير قيم الخصائص name$ و lastname$. ثم استدعينا الطريقة العامة ()getName التي بدورها تستطيع الوصول للطريقةالخاصة ()midName وبالتالي سيتم عرض الاسم الكامل.[button title=”عرض نتيجة / تحميل الكود” link=”https://makiomar.com/php-oop/php_visibility/pass_protected_private_into_public_method.php” target=”_blank” size=”” color=”” class=””]
بهذا الشكل استطعنا الوصول للخصائص / الطرق المحمية من خلال الكائن المشتق ، لكن هذا لا يعني أن هذه الخصائص أو الطرق أصبحت تنتمي للكائن الجديد، لكن هو فقط استطاع الوصول إليها لتعديلها واستخدام نتائجها.
ويطلق على الدالة التي قامت بالتعديل على الخصائص الخاصة / المحمية بـ Setter والدالة التي قامت بجلب قيم الخصائص بـ Getter .
ولكن المُعدات والمُحصلات تقوم بالتلاعب والوصول للخصائص الموجودة داخل الفئة ، بينما هُناك أيضا المٌعدات والمحصلات السحرية set__ و get__ التي تستخدم للوصول لخصائص التي لايُمكن الوصول إليها أو غير متاحة داخل الفئة.


