مفهوم البرمجة الكائنية التوجه (OOP) في لغة PHP مع مثال
⚡ ملخص ذكي
تُصمّم البرمجة الكائنية التوجه في PHP نموذج التطبيق حول كائنات من العالم الحقيقي باستخدام الفئات والكائنات. يشرح هذا الدليل مبادئ البرمجة الكائنية التوجه، كالتغليف والوراثة وتعدد الأشكال، وكيف تدعمها PHP، ويُقدّم أمثلة عملية للفئات والوراثة والواجهات خطوة بخطوة.

ما هو OOPs؟
البرمجة كائنية التوجه هي منهج لتطوير البرمجيات يُحاكي تصميم التطبيق باستخدام كائنات من العالم الحقيقي، مثل الموظفين والسيارات والحسابات المصرفية. يُعرّف الصنف خصائص وأساليب كائن من العالم الحقيقي، والكائن هو نسخة من الصنف.
المكونات الأساسية الثلاثة لمنهجية التوجه الكائني هي:
- التحليل الموجه للكائنات – وظائف النظام
- التصميم الموجه للكائنات - بنية النظام
- البرمجة الشيئية – تنفيذ التطبيق
مبادئ البرمجة الشيئية
المبادئ الرئيسية الثلاثة للبرمجة الكائنية التوجه هي:
- التغليف – يتعلق هذا بإخفاء تفاصيل التنفيذ والاكتفاء بعرض الطرق فقط. وتتمثل الأهداف الرئيسية للتغليف فيما يلي:
- تقليل تعقيد تطوير البرامج - عن طريق إخفاء تفاصيل التنفيذ وكشف العمليات فقط، يصبح استخدام الفئة أمرًا سهلاً.
- حماية الحالة الداخلية للكائن – يتم الوصول إلى متغيرات الفئة عبر طرق مثل get و set. هذا يجعل الفئة مرنة وسهلة الصيانة.
- يسمح بتغيير التنفيذ الداخلي للفئة دون القلق بشأن تعطيل الكود الذي يستخدم الفئة.
- وراثة – يتعلق هذا بالعلاقة بين الأصناف. تتخذ هذه العلاقة شكل صنف أب وصنف ابن. يستخدم الصنف الابن الطرق المُعرَّفة في الصنف الأب. والهدف الرئيسي من الوراثة هو:
- إمكانية إعادة الاستخدام – يمكن لعدد من العناصر الفرعية أن ترث من نفس العنصر الأصل. وهذا مفيد للغاية عندما نحتاج إلى توفير وظائف مشتركة مثل إضافة البيانات وتحديثها وحذفها من قاعدة البيانات.
- تعدد الأشكال – يتعلق هذا الأمر بوجود واجهة واحدة ذات تطبيقات متعددة ومختلفة. والهدف الرئيسي من تعدد الأشكال هو:
- لتبسيط صيانة التطبيقات وجعلها أكثر قابلية للتوسيع.
وجه الفتاة Concepts في PHP
لغة PHP هي لغة برمجة نصية كائنية التوجه؛ وهي تدعم جميع المبادئ المذكورة أعلاه. وتتحقق هذه المبادئ من خلال:
- التغليف – عبر استخدام طرق "get" و "set" ومعدلات الوصول.
- وراثة – عن طريق استخدام الكلمة المفتاحية extends
- تعدد الأشكال – عن طريق استخدام الكلمة المفتاحية للأدوات
الآن بعد أن أصبح لدينا المعرفة الأساسية بـ OOP وكيفية دعمها PHPدعونا نلقي نظرة على أمثلة تُطبّق المبادئ المذكورة أعلاه.
ما هو UML؟
لغة النمذجة الموحدة (UML) هي تقنية تستخدم لتصميم وتوثيق الأنظمة الموجهة للكائنات.
ينتج UML عددًا من المستندات، لكننا سنلقي نظرة على مخطط الفئات، وهو أمر مهم للغاية لبرمجة PHP الموجهة للكائنات.
مثال على مخطط الفئة
مفتاح مخطط الفئة
- استخدم الصندوق العلوي يحتوي على اسم الفئة
- استخدم الصندوق الأوسط يحتوي على متغيرات الفئة
- استخدم الصندوق السفلي يحتوي على أساليب الطبقة
- استخدم ناقص (-) تعني العلامة نطاقًا خاصًا
- استخدم زائد (+) علامة تعني النطاق العام
- استخدم التجزئة (#) التوقيع يعني النطاق المحمي
كيفية إنشاء فئة في PHP
يتم استخدام الكلمة الأساسية class لتحديد فئة في PHP. فيما يلي قواعد إنشاء فئة في PHP.
- يجب أن يبدأ اسم الفصل بحرف
- لا يمكن أن يكون اسم الفئة كلمة PHP محجوزة
- لا يمكن أن يحتوي اسم الفئة على مسافات
لنفترض أننا نريد إنشاء فئة لتمثيل الحيوانات. سنبدأ بتحديد السمات المشتركة بين جميع الحيوانات.
- جميع الحيوانات تنتمي إلى عائلة مثل الحيوانات العاشبة، والحيوانات اللاحمة، وما إلى ذلك.
- جميع الحيوانات تأكل الطعام
يوضح الرسم البياني أدناه مخطط الفئات الخاص بالحيوان.
لنبدأ الآن ببرمجة فئة الحيوانات.
<?php class Animal { private $family; private $food; public function __construct($family, $food) { $this->family = $family; $this->food = $food; } public function get_family() { return $this->family; } public function set_family($family) { $this->family = $family; } public function get_food() { return $this->food; } public function set_food($food) { $this->food = $food; } } ?>
هنا،
- "private $family, $food" تعني أنه لا يمكن الوصول إلى المتغيرات مباشرة خارج الفئة (التغليف).
- الدالة `public function __construct($family…)` هي دالة البناء في لغة PHP. يتم استدعاء هذه الدالة عند إنشاء نسخة من الصنف. في هذه الحالة، نقوم بتعيين قيمتي العائلة والطعام.
- "public function get…()" هي الطريقة المستخدمة للوصول إلى قيمة العائلة أو الطعام (التغليف).
- "public function set…()" هي الطريقة المستخدمة لتعيين قيمة العائلة أو الطعام (التغليف).
كيفية تطبيق الوراثة في لغة PHP
سوف نعمل مع بقرة وأسد. يرث كل من البقرة والأسد من فئة الحيوان.
يوضح الرسم البياني للفئة أدناه العلاقات.
لاحظ أن البقرة ترث من فئة الحيوان وتحدد متغيراتها وأساليبها الخاصة أيضًا.
لنقم الآن ببرمجة فئة البقرة.
<?php class Cow extends Animal { private $owner; public function __construct($family, $food) { parent::__construct($family, $food); } public function set_owner($owner) { $this->owner = $owner; } public function get_owner() { return $this->owner; } } ?>
لنبدأ الآن ببرمجة فئة الأسد.
<?php class Lion extends Animal { public function __construct($family, $food) { parent::__construct($family, $food); } } ?>
هنا،
- "class … extends Animal" يجعل فئتي البقرة والأسد تستخدمان طرقًا من فئة الحيوان (الوراثة).
كيفية إنشاء كائن من الفئة
يجب أن تكون فئات الحيوان والبقرة والأسد جميعها في نفس الدليل من أجل البساطة.
لنقم الآن بإنشاء التطبيق الذي يستخدم فئاتنا.
مثال فئة PHP
<?php require 'Animal.php'; require 'Cow.php'; require 'Lion.php'; $cow = new Cow('Herbivore', 'Grass'); $lion = new Lion('Carnivore', 'Meat'); echo '<b>Cow Object</b> <br>'; echo 'The Cow belongs to the ' . $cow->get_family() . ' family and eats ' . $cow->get_food() . '<br><br>'; echo '<b>Lion Object</b> <br>'; echo 'The Lion belongs to the ' . $lion->get_family() . ' family and eats ' . $lion->get_food(); ?>
اختبار تطبيقنا
لنستعرض الآن تطبيقنا في متصفح الويب.
يعيد كلا الكائنين استخدام طريقتي get_family و get_food الموروثتين من فئة Animal، مما يوضح عملية الوراثة عمليًا.
كيفية تطبيق تعدد الأشكال في لغة PHP
لنفترض أننا نريد تطوير تطبيق يتصل بمحركات قواعد بيانات مختلفة مثل MySQL و SQL الخادم، لكنه يستخدم نفس الواجهة الموحدة. يمكننا إنشاء واجهة تُعرّف الطرق القياسية وقيمة مطلقة.tracفئة t التي تنفذ الأساليب الشائعة.
- السطح البيني - إنه مشابه لفئة. إنه يحدد فقط الأساليب والمعلمات.
- ABStracفئة t - إنها فئة لا يمكن استخدامها لإنشاء كائن مباشرة. والغرض منه هو توفير تطبيقات جزئية أو كاملة للطرق الشائعة.
يوضح مخطط الفئات أدناه العلاقة بين فئتناtracفئة t، والواجهة، وفئات التنفيذ.
لنبدأ الآن في بناء عضلات البطنtracالفئة t.
<?php abstract class DBCommonMethods { private $host; private $db; private $uid; private $password; public function __construct($host, $db, $uid, $password) { $this->host = $host; $this->db = $db; $this->uid = $uid; $this->password = $password; } } ?>
هنا،
- "abstracيعني مصطلح "الفئة t" أنه لا يمكن استخدام الفئة مباشرةً لإنشاء كائن
- المتغيرات "$host" و "$db" ... هي متغيرات فئة مشتركة بين جميع التطبيقات.
- الدالة "function __construct(…)" هي دالة البناء الخاصة بالفئة والتي تقوم بتعيين قيم المتغيرات المشتركة عند التهيئة
لنقم الآن بإنشاء الواجهة التي تحتوي على الطرق القياسية، والتي سيتم تنفيذها بشكل مختلف اعتمادًا على محرك قاعدة البيانات.
<?php
interface DBInterface
{
public function db_connect();
public function insert($data);
public function read($where);
public function update($where);
public function delete($where);
}
?>
هنا،
- "الواجهة" هي الكلمة الأساسية لإنشاء الواجهات
- "الوظيفة العامة...(...)" هي الأساليب القياسية التي ينبغي تنفيذها
لنقم الآن بإنشاء الفئات الملموسة التي ستوسع فئة DBCommonMethods وتنفذ واجهة DBInterface. أولاً، MySQLDriver.php:
<?php class MySQLDriver extends DBCommonMethods implements DBInterface { public function __construct($host, $db, $uid, $password) { parent::__construct($host, $db, $uid, $password); } public function db_connect() { /* connect code goes here */ } public function delete($where) { /* delete code goes here */ } public function insert($data) { /* insert code goes here */ } public function read($where) { /* read code goes here */ } public function update($where) { /* update code goes here */ } } ?>
ثم، MSSQLServerDriver.php:
<?php class MSSQLServerDriver extends DBCommonMethods implements DBInterface { public function __construct($host, $db, $uid, $password) { parent::__construct($host, $db, $uid, $password); } public function db_connect() { /* connect code goes here */ } public function delete($where) { /* delete code goes here */ } public function insert($data) { /* insert code goes here */ } public function read($where) { /* read code goes here */ } public function update($where) { /* update code goes here */ } } ?>
هنا،
- يستخدم "class … extends DBCommonMethods" الطرق الموجودة في DBCommonMethods
- "... ينفذ واجهة قاعدة البيانات" يضمن أن يوفر الصنف الطرق القياسية بغض النظر عن برنامج تشغيل قاعدة البيانات المستخدم.
سيبدو الكود الذي يستخدم الفئات المذكورة أعلاه كما يلي:
<?php $db = new MySQLDriver($host, $db, $uid, $password); ?>
أو:
<?php $db = new MSSQLServerDriver($host, $db, $uid, $password); ?>
أما بقية الكود فستكون متطابقة لكلا السائقين، مثل:
<?php $db->db_connect(); $db->insert($data); ?>
هذا هو تعدد الأشكال في العمل: تعمل استدعاءات الأساليب نفسها على أي برنامج تشغيل يقوم بتنفيذ الواجهة، لذلك لا يتغير الكود المحيط أبدًا عند تبديل محركات قواعد البيانات.





