أنواع حدود الرؤية
يمكن تحديد امكانية الوصول لخصائص وطرق الفئات ( PHP Classes ) عن طريق استخدام حدود الرؤية ( PHP Visibility )، ويتم ذلك عن طريق ثلاثة حدود هي :
Public Private Protected عام Public :تعني أن هذه الخاصية / الطريقة ( Property / Method ) يمكن الوصول إليها ( التعديل عليها / استخدامها ) من كود داخل الفئة أو خارجها.
ويمكن تعريف الخاصية / الطريقة على أنها ذات مجال رؤية عام عن طريق إضافة الكلمة Public قبل الخاصية / الطريقة
<?php class ClassName { public $property; public function func(){ /*code here*/ } } ?>مثال :
<?php class human{ // تعريف الخصائص public $name; public $lastname; // تعريف الطرق public function CompleteName(){ echo "His complete name is".' '.$this->name.' '.$this->lastname; } } // إنشاء كائن جديد $Ahmed = new human(); //تعريف خصائص الكائن $Ahmed->name = "Ahmed"; $Ahmed->lastname = "Mahmoud"; //استدعاء طريقة الكائن والتي هي طريقة الفئة $Ahmed->CompleteName().'<br>'; ?>عند تعريف الخصائص والطرق على أنها public ، يمكن الوصول إليها من أي مكان ويظهر ذلك عندما أنشأنا كائن جديد في السطر رقم 12 ثم قمنا بالتعديل على الخواص ( name – lastname ) بشكل طبيعي وعند تجربة الكود لن تظهر أخطاء .
[button title=”عرض نتيجة / تحميل الكود” link=”https://makiomar.com/php-oop/php_visibility/public.php” target=”_blank” size=”” color=”” class=””]
خاص Privateتعني أن هذه الخاصية / الطريقة ( Property / Method ) لا يمكن الوصول إليها ( التعديل عليها / استخدامها ) إلا من كود داخل الفئة . أي لايمكن استخدامها خارج إطار الفئة سواء عن طريق كائن مشتق من الفئة أو من خلال التوريث. وسيتم التحدث عن توريث الفئات في الموضوع الخاص بتوريث الفئات ( PHP Inheritance ).
ويمكن تعريف الخاصية / الطريقة على أنها ذات مجال رؤية خاص عن طريق إضافة الكلمة Private قبل الخاصية / الطريقة
<?php class ClassName { private $property; private function func(){ /*code here*/ } } ;?>مثال :
أنظر طريقة تعريف خصائص الفئة التالية
<?php class human{ // تعريف الخصائص public $name; private $lastname="Mahmoud"; // تعريف الطرق public function CompleteName(){ echo "His complete name is".' '.$this->name.' '.$this->lastname; } } // إنشاء كائن جديد $Ahmed = new human(); //تعريف خصائص الكائن $Ahmed->name = "Ahmed"; //استدعاء طريقة الكائن والتي هي طريقة الفئة $Ahmed->CompleteName().'<br>'; // lastname محاولة تعديل قيمة //$Ahmed->lastname = "Ibrahim"; ?>شرح الكود :
1- قمنا بتعريف الفئة وأعطيناها الاسم human
2- في السطر رقم 4 قمنا بتعريف الخاصية name$ وجعلناها عامة باستخدام الكلمة public
3- في السطر رقم 5 قمنا بتعريف الخاصية lastname$ وجعلناها خاصة باستخدام الكلمة private ، وأعطيناها القيمة ” Mahmoud “
4- في السطر رقم 7 قمنا بتعريف الطريقة ()CompleteName التي تطبع الاسم الثنائي للكائن الذي سنقوم بإنشاءه من الفئة
5- بدأنا في السطر رقم 12 بإنشاء كائن جديد باسم Ahmed$ باستخدام الكلمة new
6- في السطر رقم 14 بدأنا في تعريف خصائص الكائن الجديد بتعريف الخاصية name وأعطيناها القيمة ” Ahmed “
7- في السطر رقم 16 استدعينا الطريقة CompleteName التي تطبع الاسم الثنائي، وستكون النتيجة هي ” His complete name is Ahmed Mahmoud “.
8- ثم حاولنا في السطر رقم 18 تغير قيمة الخاصية lastname إلى ” Ibrahim ” . لكن في هذه الحالة سيظهر خطأ فادح ( Fetal Error ) ينص بأنه لايمكن الوصول لقيمة الخاصية الخاصة .( قم بإزالة علامة التعليق // )
[highlight background=”” color=””]قد لا يظهر الخطأ وذلك حسب إعدادات معالجة الأخطاء ( PHP Errors Handling )[/highlight]
[button title=”عرض نتيجة / تحميل الكود” link=”https://makiomar.com/php-oop/php_visibility/private.php” tarhttps://makiomar.com/wp-admin/post.php?post=2327&action=editget=”_blank” size=”” color=”” class=””]
كذلك الأمر بالنسبة للطرق الخاصة ، فهي أيضاً لا يمكن الوصول إليها عن طريق التوريث أو الكائنات المنشقة من الفئة. لاحظ تعريف الدالة الخاصة في الكود التالي
<?php class human{ // تعريف الخصائص public $name; private $lastname="Mahmoud"; // تعريف الطرق private function CompleteName(){ echo "His complete name is".' '.$this->name.' '.$this->lastname; } } // إنشاء كائن جديد $Ahmed = new human(); //تعريف خصائص الكائن $Ahmed->name = "Ahmed"; //CompleteName محاولة استدعاء الطريقة الخاصة echo "محاولة فاشلة ولن تظهر نتائج"; //$Ahmed->CompleteName(); ?>تم تعريف الطريقة ()CompleteName في السطر رقم 7 ، ثم أنشأنا كائن جديد في السطر رقم 12 وحاولنا استدعاء هذه الطريقة الخاصة في السطر رقم 17 ، لكن سيظهر خطأ فادح ( Fetal Error ) ينص على أنا هناك محاولة لاستدعاء الدالة الخاصة بالفئة.
[button title=”عرض نتيجة / تحميل الكود” link=”https://makiomar.com/php-oop/php_visibility/private_method.php” target=”_blank” size=”” color=”” class=””]
[highlight background=”” color=””]إذا لم تظهر الأخطاء فيجب تعديل إعدادت الأخطاء ( Errors Handling ) في ملف php.ini [/highlight]
محمي Protectedتعني أن هذه الخاصية / الطريقة ( Property / Method ) يمكن الوصول إليها ( التعديل عليها / استخدامها ) من كود داخل الفئة أو من الفئات الوارثة فقط ، لكن لا يمكن استخدامها من الكائنات المشتقة من الفئة .
ويمكن تعريف الخاصية / الطريقة على أنها ذات مجال رؤية محمي عن طريق إضافة الكلمة protected قبل الخاصية / الطريقة
<?php class ClassName { protected $property; protected function func(){ /*code here*/ } } ?>لاختبار كيف تقوم protected بحماية الخصائص / الطرق من الكائنات المشتقة لاحظ طريق تعريف الخاصية lastname$ في الكود التالي :
<?php class human{ // تعريف الخصائص public $name; protected $lastname;//تعريف خاصية محمية // تعريف الطرق public function CompleteName(){ echo "His complete name is".' '.$this->name.' '.$this->lastname; } } // إنشاء كائن جديد $Ahmed = new human(); //تعريف خصائص الكائن $Ahmed->name = "Ahmed"; //lastname محاولة تعديل قيمة الخاصية echo'<p>محاولة فاشلة ولن تظهر نتائج</p>'; //$Ahmed->lastname = "Mahmoud"; ?>عند محاولة التعديل على قيمة الخاصية المحمية lastname$ في السطر رقم 17 سيظهر خطأ فادح ( Fetal Error ) ينص على أنا هناك محاولة لاستدعاء خاصية محمية بالفئة.
[button title=”عرض نتيجة / تحميل الكود” link=”https://makiomar.com/php-oop/php_visibility/protected.php” target=”_blank” size=”” color=”” class=””]
بهذا قد عرفنا فوائد حدود الرؤية للخصائص والطرق ومتى يمكن استخدام كل منها ، بحيث تُستخدم حدود الرؤية public للسماح بالوصول للخصائص من أي مكان سواء عن طريق كائن أو فئة وارثة ، أما حدود الرؤية protected تُستخدم عندم تريد منع كائن من الوصول للخصائص أو الطرق ولكن يمكن لفئة وارثة الوصول إليهم، أم حدود الرؤية private فهي تمنع الكائنات أو الفئات الوارثة من الوصول لهذه الخصائص أو الطرق.
لكن هل هناك طريقة للتحايل على حدود الرؤية protected و private ؟
نعم يمكنك التلاعب الخصائص والطرق المحمية والخاصة عن طريق تمريرهم داخل طريقة عامة داخل الفئة ، وبالتالي بما أن هذه الطريقة public فيمكن للكائن أو الفئة الوارثة الوصول للخصائص والطرق المحمية والخاصة. وفي هذه الحالة نطلق على الطرق المسؤلة عن الوصل وجلب الخصائص والطرق التي لايمكن الوصول إليها بـ ( المُعدات والمُحصلات PHP Setters and Getters ).
والآن لمعرفة كيف تحدد مجالات الرؤية Visibility امكانية وصول الفئات الوارثة اقرأ عن توريث الفئات ( PHP Classes Inheritance ).


