اذهب إلى المحتوى
  • 0

مفهوم التغليف Encapsulation في البرمجة الشيئية OOP في PHP

Seyid Ahmed Khessam

السؤال

السلام عليكم ورحمة الله تعالى وبركاته ..♥

اواجه مشكلة في فهم نظام تغليف البيانات حيث انني تابعت اكثر من درس يشرح هاد الامر لكن لم استوعبه خاصة انه ليس له كلمات محجوزة خاصة به او توابع اعتقد انه مجرد مفهوم للكتابة الكود بطريقة سليمة ارجو ولو شرح بسيط عنه وماهي استخداماته اي متى نستعمله

وفي الختام اشكر كل من افادني والصلاة والسلام على نبينا وحبيبنا وقائدنا محمد صلواة ربي عليه

رابط هذا التعليق
شارك على الشبكات الإجتماعية

Recommended Posts

  • 1

و عليكم السلام و رحمة الله تعالى و بركاته . 
لنقم بفهم التغليف كالتالي : 

  • التغليف ترجمة عن encapsulation هو ميكانيزمة و طريقة لحماية الخواص و التوابع التابعة لصنف ما من التعديل المباشر عليها مع إمكانية إستعمال تابع معين للصنف لتعديل ذلك . 

و لكن ما الذي يعنيه ذلك ؟ لنأخذ التالي لفهم الحاجة من التغليف أساسا : 

تقوم شركات صنع سيارات بتوفير مقود في سياراتها كآلة للتحكم في إتجاهات سير السيارة , و من جانب اخر تقوم بإخفاء التعقيد وراء هاته العملية . أي أنها تقوم بتغليف و تغطية كل ما يتعلق بكيفية سيرها و توفير طريقة بسيطة لتغيير خاصية الإتجاه في السيارة . فهل يبدوا من المنطقي أن نقوم بتوصيل سلك بسلك أو تطبيق قوة ميكانيكية كل مرة نريد فيها تغيير اتجاه سيارة ؟ 

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

مثال عملي : 

ليكن الصنف DBInteract , المسؤول عن التفاعل مع قاعدة البيانات عن طريق عمليات CRUD العادية كالتالي :

class DBInteract{
   public $db_password = '68426123';
   public $db_username = 'root'; 
   public $db_name = 'my-db';


   public function insert(string $table ,array $data) { }
   public function update(string $table ,array $data) { }
   public function delete(string $table) { }
   public function select(string $table ,array $rows) { }

}

و لنفرض أن كل من التوابع المعرفة تحمل شيفرات يمكن فهم وظيفتها عن طريق اسماءها الدلالية . 

و لنقل أننا نحتاج إدراج مهمة جديدة بجدول tasks في قاعدة البيانات بإسم my-db . 

أي أن العملية ستكون كالتالي : 

$db_class = new DBInteract();


$db_class->insert('tasks' ,$data);

و منطقي هو أن التابع insert المسؤول عن عملية الإنشاء سيقوم بإستعمال الخواص التالية لمصادقة إتصاله مع قواعد البيانات : 

public $db_password = '68426123';
public $db_username = 'root'; 
public $db_name = 'my-db';

المشكلة هنا , هي أن هاته الخواص قابلة للوصول بشكل عادي عن طريق إستدعاء مباشر من أي كائن عن الصنف DBInteract . فلو أن مستخدما ما لصنفنا الجاهز DBInteract قام بتغيير الخاصية db_name بعد عشرات من إستعلامات الإنشاء و القراءة و الحذف و التعديل بمجرد سطر واحد : 

$db_class->db_name = 'new-db-name';

و لنقل أن بيانات المصادقة تحتاج فحصا قبل إعادة التعيين مثل أن يكون اسم قاعدة بياناتنا سلسلة نصية , و اسم مستخدمنا ليس قيمة فارغة , و كلمة سرنا تشكيلة أرقام . 

في حالة تعطل ذلك سيخل هذا بعمل كل من التوابع insert , update , delete , select . و هو ما لا نريده طبعا . 

و لحل المشكل لن نقوم إلا بتغليف هاته الخواص بإستعمال الكلمة المفتاحية private و إنشاء تابع جديد يمكننا من تغيير بيانات المصادقة هاته بطريقة سليمة لا تؤثر على عمل باقي التوابع . و ليكن  مثلا : 

class DBInteract{
   private $db_password = '68426123';
   private $db_username = 'root'; 
   private $db_name = 'my-db';
   
   public function changeCreds($pass , $un , $db)
   {
       if(is_string($db) && is_numeric($pass) && !is_null($un)){
          $this->db_password = $pass;
          $this->db_username = $un;
          $this->db_name = $db;
       }
   }

   public function insert(string $table ,array $data) { }
   public function update(string $table ,array $data) { }
   public function delete(string $table) { }
   public function select(string $table ,array $rows) { }

}

الان لو حاول شخص ما تغيير أحد بيانات المصادقة عن طريق مباشرة فهو لن يستطيع , و ستظهر له رسالة تخبره بذلك : 

cannot access private property

و قس على ذلك العديد من الأمثلة و الوضعيات الأخرى التي تكون فكرة التغليف حلا فيها .

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 1
بتاريخ 40 دقائق مضت قال Seyid Ahmed Khessam:

شكرا لك اخي على الشرح الممتاز كالعادة زادك الله علما ينفعك 

الخلاصة التي وصلت اليها هي ان نظام التغليف يستعمل بشكل عام مع البيانات الحساسة بحيث يتم جعل الخواص التي تحمل قيم حساسة التي لايجب التعديل عليها او التعامل معها بطريقة مباشرة جعلها private ومن اجل التعامل معها سيتوجب استدعاء method من نفس الصنف وتمرير argument في ال method في حالة ما اردنا التعديل على الخواص :)

نعم بالضبط . 

و أضيف على ذلك , التوابع أيضا . فمن الممكن تغليف التوابع و جعلها غير قابلة للوصول إلا من خلال الصنف نفسه أيضا . 

كما أظن أن الحاجة لذلك في مسارك و أثناء تطبيقك العملي ستقوم بتوضيح ذلك أكثر لك . 

تعرف الكلمات public , private و protected في الوسط البرمجي كمحددات وصول ترجمة عن Access Modifiers بحيث تحدد هاته الكلمات الخواص و التوابع التي يمكن الوصول إليها . 

بحيث أن :

  • public : تعني أن الوصول إليها قابل في كل مكان .
  • protected : تعني أن الوصول محمي فقط داخل الصنف نفسه , و من داخل أي أصناف ترث هذا الصنف أيضا .
  • private : تعني أن الوصول لا يتم إلا من خلال الصنف الذي يحدد هاته الخاصية أو أحد توابعه العامة .

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0

شكرا لك اخي على الشرح الممتاز كالعادة زادك الله علما ينفعك 

الخلاصة التي وصلت اليها هي ان نظام التغليف يستعمل بشكل عام مع البيانات الحساسة بحيث يتم جعل الخواص التي تحمل قيم حساسة التي لايجب التعديل عليها او التعامل معها بطريقة مباشرة جعلها private ومن اجل التعامل معها سيتوجب استدعاء method من نفس الصنف وتمرير argument في ال method في حالة ما اردنا التعديل على الخواص :)

 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ منذ ساعة مضت قال Adnane Kadri:

نعم بالضبط . 

و أضيف على ذلك , التوابع أيضا . فمن الممكن تغليف التوابع و جعلها غير قابلة للوصول إلا من خلال الصنف نفسه أيضا . 

كما أظن أن الحاجة لذلك في مسارك و أثناء تطبيقك العملي ستقوم بتوضيح ذلك أكثر لك . 

تعرف الكلمات public , private و protected في الوسط البرمجي كمحددات وصول ترجمة عن Access Modifiers بحيث تحدد هاته الكلمات الخواص و التوابع التي يمكن الوصول إليها . 

بحيث أن :

  • public : تعني أن الوصول إليها قابل في كل مكان .
  • protected : تعني أن الوصول محمي فقط داخل الصنف نفسه , و من داخل أي أصناف ترث هذا الصنف أيضا .
  • private : تعني أن الوصول لا يتم إلا من خلال الصنف الذي يحدد هاته الخاصية أو أحد توابعه العامة .

بارك الله فيك اخي الفكرة وصلت على اكمل وجه جزاك الله خير الجزاء وزادك علما تنفع وتنتفع به وادخلك فسيح جناته 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

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

×   جرى استعادة المحتوى السابق..   امسح المحرر

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

  • إعلانات

  • تابعنا على



×
×
  • أضف...