تحديد Visibility للخصائص Properties و الأفعال Methods في البرمجة الكائنية

Ali Majrashiمنذ 9 سنوات

بتحديد مدى الرؤية Visibility انت تقوم بإضافة طبقة إضافية للتحكم بالخصائص Properties والأفعال Methods وعن طريقها نتحكم بالأماكن و الطرق التي تمكننا من الوصول للخصائص Properties والأفعال Methods لدينا ٣ كلمات لتحديد مدى الرؤية Visibility وهم

  1. public
  2. protected
  3. private

"For added control over objects, methods and properties are assigned visibility."

للتعرف على البرمجة الكائنية ننصحك بقراءة كل من

https://3alam.pro/index.php/articles/php/object-oriented-programming-php/https://3alam.pro/index.php/articles/php/magic-methods-in-oop/https://3alam.pro/index.php/articles/php/class-inheritance-oop/

الخصائص والأفعال العامة 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();

لو قمنا بتشغيل الملف من المتصفح سيكون الناتج كالتالي

1.png

تنبيه: سبق و أن ذكرنا انه عند استخدام 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();

لو قمنا بتشغيل الملف من المتصفح سيكون الناتج كالتالي

2.png

الخصائص والأفعال الخاصة 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();

لو قمنا بتشغيل الملف من المتصفح سيكون الناتج كالتالي

3.png

الخلاصة 

بتحديد مدى الرؤية Visibility للخصائص و الأفعال عند تعريفهم داخل الكلاس يسمح لك بوضع قيود وحدود لمدى استخدامهم فلو كنت ترغب بإستخدامهم والوصول لهم من اي مكان تسطيع استخدام public و إن كنت ترغب بوضع قيود لاستخدامهم داخل الكلاس فقط او من داخل الكلاسات التي ترث هذا الكلاس الذي يحتوي هذه الأفعال والخصائص نستخدم protected اما ان كنت ترغب بان تكون هذه الخصائص والأفعال خاصة بالكلاس فقط وعدم توريثها لكلاسات اخرى نستخدم private

كلمات دليلية:
0
إعجاب
2605
مشاهدات
0
مشاركة
0
متابع
متميز
محتوى رهيب

التعليقات (0)

لايوجد لديك حساب في عالم البرمجة؟

تحب تنضم لعالم البرمجة؟ وتنشئ عالمك الخاص، تنشر المقالات، الدورات، تشارك المبرمجين وتساعد الآخرين، اشترك الآن بخطوات يسيرة !