تحديد Visibility للخصائص Properties و الأفعال Methods في البرمجة الكائنية
بتحديد مدى الرؤية Visibility انت تقوم بإضافة طبقة إضافية للتحكم بالخصائص Properties والأفعال Methods وعن طريقها نتحكم بالأماكن و الطرق التي تمكننا من الوصول للخصائص Properties والأفعال Methods لدينا ٣ كلمات لتحديد مدى الرؤية Visibility وهم
- public
- protected
- private
"For added control over objects, methods and properties are assigned visibility."
للتعرف على البرمجة الكائنية ننصحك بقراءة كل من
الخصائص والأفعال العامة Public Properties and Methods
جميع الأفعال والخصائص المستخدمة بأمثلة المقالات السابقة جميعها عامة public مما يسمح لنا الوصول لهم من اي مكان سواء داخل الكلاس او خارجه بدون اي قيود
الخصائص والأفعال المحمية Protected Properties and Methods
عند كتابة خاصية Property او فعل Method وتعيين مدى الرؤية Visibilty كـ محمي protected فإن الوصول لهم يصبح محدود بداخل الكلاس او داخل الكلاسات التي ترث الكلاس الرئيسي فقط فلو حاولت استدعائهم مباشرة خارج الكلاس ستحصل على Fatal Error خطأ
لتبسيط الأمثلة سوف نستخدم نفس اسلوب الأكواد في المقالات السابقة
لنفرض ان لديك ملف php وبداخله هذا الكلاس من الأمثلة السابقة
<?php
class SimpleClass
{
public $property = "I'm a class property!";
public function __construct()
{
echo 'The class was initiated successfully From SimpleClass. <br/>';
}
public function __destruct()
{
echo 'The class was destroyed finally From SimpleClass. <br/>';
}
public function __toString()
{
return 'Using the toString method <br/>';
}
public function setProperty($newValue)
{
$this->property = $newValue;
}
public function getProperty()
{
return $this->property . "<br/>";
}
}
class MyOtherClass extends SimpleClass
{
public function __construct()
{
parent::__construct(); // Call the parent class constructor
echo 'A new constructor From MyOtherClass. <br/>';
}
public function newMethod()
{
echo "From newMethod() in MyOtherClass. <br/>";
}
}
بعدها سنقوم بتعديل بسيط على الكلاس SimpleClass وتحديد الفعل getProperty كمحمي protected ثم نقوم بإنشاء كائن جديد من الكلاس MyOtherClass ثم محاولة إستدعاء الفعل getProperty ليصبح محتوى الكود كالتالي
<?php
class SimpleClass
{
public $property = "I'm a class property!";
public function __construct()
{
echo 'The class was initiated successfully From SimpleClass. <br/>';
}
public function __destruct()
{
echo 'The class was destroyed finally From SimpleClass. <br/>';
}
public function __toString()
{
return 'Using the toString method <br/>';
}
public function setProperty($newValue)
{
$this->property = $newValue;
}
protected function getProperty()
{
return $this->property . "<br/>";
}
}
class MyOtherClass extends SimpleClass
{
public function __construct()
{
parent::__construct(); // Call the parent class constructor
echo 'A new constructor From MyOtherClass. <br/>';
}
public function newMethod()
{
echo "From newMethod() in MyOtherClass. <br/>";
}
}
// Create a new object From MyOtherClass
$newobject = new MyOtherClass;
// attempt to call protected method
echo $newobject->getProperty();
لو قمنا بتشغيل الملف من المتصفح سيكون الناتج كالتالي
تنبيه: سبق و أن ذكرنا انه عند استخدام protected يصبح التعامل مع الأفعال Methods والخصائص Properites من داخل الكلاس او من داخل الكلاسات التي ترث الكلاس الأساسي الذي يحتوي الفعل او الخاصية المحمية protected
الآن سنقوم بعمل فعل جديد callProtected داخل الكلاس MyOtherClass و نحدد Visiblity كـ public حتى نستطيع عن طريق هذا الفعل الوصول و إستدعاء الفعل المحمي getProperty من خارج الكلاس بكل سهولة
ليصبح متحوى الكود كالتالي
<?php
class SimpleClass
{
public $property = "I'm a class property!";
public function __construct()
{
echo 'The class was initiated successfully From SimpleClass. <br/>';
}
public function __destruct()
{
echo 'The class was destroyed finally From SimpleClass. <br/>';
}
public function __toString()
{
return 'Using the toString method <br/>';
}
public function setProperty($newValue)
{
$this->property = $newValue;
}
protected function getProperty()
{
return $this->property . "<br/>";
}
}
class MyOtherClass extends SimpleClass
{
public function __construct()
{
parent::__construct(); // Call the parent class constructor
echo 'A new constructor From MyOtherClass. <br/>';
}
public function newMethod()
{
echo "From newMethod() in MyOtherClass. <br/>";
}
public function callProtected()
{
return $this->getProperty();
}
}
// Create a new object From MyOtherClass
$newobject = new MyOtherClass;
// attempt to call protected method
echo $newobject->callProtected();
لو قمنا بتشغيل الملف من المتصفح سيكون الناتج كالتالي
الخصائص والأفعال الخاصة Private Properties and Methods
عند كتابة خاصية Property او فعل Method وتعيين مدى الرؤية Visibilty كـ خاص private فإن الوصول لهم يصبح محدود بداخل الكلاس الذي قام بتعريفهم فقط ومعنى ذلك حتى لو يوجد كلاس جديد يقوم بوراثة الكلاس الأساسي فانه لن يرث الخصائص الخاصة private properties و الأفعال الخاصة protected methods أبدا فهي خاصة بالكلاس الرئيسي فقط
ولتوضيح الفكرة بالكود السابق قم بتغيير Visibilty للفعل getProperty ليصبح private بدل protected وبعدها نقوم باستدعاء الفعل callProtected عن طريق الكلاس MyOtherClass ليصبح محتوى الكود كالتالي
<?php
class SimpleClass
{
public $property = "I'm a class property!";
public function __construct()
{
echo 'The class was initiated successfully From SimpleClass. <br/>';
}
public function __destruct()
{
echo 'The class was destroyed finally From SimpleClass. <br/>';
}
public function __toString()
{
return 'Using the toString method <br/>';
}
public function setProperty($newValue)
{
$this->property = $newValue;
}
private function getProperty()
{
return $this->property . "<br/>";
}
}
class MyOtherClass extends SimpleClass
{
public function __construct()
{
parent::__construct(); // Call the parent class constructor
echo 'A new constructor From MyOtherClass. <br/>';
}
public function newMethod()
{
echo "From newMethod() in MyOtherClass. <br/>";
}
public function callProtected()
{
return $this->getProperty();
}
}
// Create a new object From MyOtherClass
$newobject = new MyOtherClass;
// attempt to call protected method
echo $newobject->callProtected();
لو قمنا بتشغيل الملف من المتصفح سيكون الناتج كالتالي
الخلاصة
بتحديد مدى الرؤية Visibility للخصائص و الأفعال عند تعريفهم داخل الكلاس يسمح لك بوضع قيود وحدود لمدى استخدامهم فلو كنت ترغب بإستخدامهم والوصول لهم من اي مكان تسطيع استخدام public و إن كنت ترغب بوضع قيود لاستخدامهم داخل الكلاس فقط او من داخل الكلاسات التي ترث هذا الكلاس الذي يحتوي هذه الأفعال والخصائص نستخدم protected اما ان كنت ترغب بان تكون هذه الخصائص والأفعال خاصة بالكلاس فقط وعدم توريثها لكلاسات اخرى نستخدم private
التعليقات (0)
عرض المزيد.. جديد مقالاتي
لايوجد لديك حساب في عالم البرمجة؟
تحب تنضم لعالم البرمجة؟ وتنشئ عالمك الخاص، تنشر المقالات، الدورات، تشارك المبرمجين وتساعد الآخرين، اشترك الآن بخطوات يسيرة !