مفهوم البرمجة الكائنية التوجه (OOP) في لغة PHP مع مثال

⚡ ملخص ذكي

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

  • 🧱 الفئات والكائنات: يُعرّف الصنف خصائص وأساليب شيء حقيقي في العالم، والكائن هو نسخة واحدة من ذلك الصنف.
  • 🔒 التغليف: تعمل المتغيرات الخاصة ذات طرق get و set العامة على إخفاء التفاصيل الداخلية وحماية حالة الكائن.
  • 👪 ميراث: تتيح الكلمة المفتاحية extends للفئة الفرعية إعادة استخدام أساليب الفئة الأصلية، مما يقلل من تكرار التعليمات البرمجية.
  • 🔁 تعدد الأشكال: تحدد الواجهة أساليب قياسية تنفذها العديد من الفئات بشكل مختلف ضمن إطار عمل موحد.tract.
  • 📐 مخطط فئات UML: يوضح مخطط الفئة اسم الفئة والمتغيرات والأساليب، مع استخدام علامات الجمع والطرح والتجزئة لتحديد النطاق العام والخاص والمحمي.
  • 🧩 الواجهات والامتصاصtract: عضلات بطنtracتتشارك الفئة t في التعليمات البرمجية المشتركة، بينما تضمن الواجهة أن توفر كل فئة من فئات السائق نفس الأساليب.
  • 🤖 مساعدة الذكاء الاصطناعي: يمكن لأدوات الذكاء الاصطناعي إنشاء فئة PHP من وصف وإعادة هيكلة التعليمات البرمجية الإجرائية إلى تعليمات برمجية نظيفة موجهة للكائنات.

البرمجة الكائنية التوجه في لغة PHP

ما هو OOPs؟

البرمجة كائنية التوجه هي منهج لتطوير البرمجيات يُحاكي تصميم التطبيق باستخدام كائنات من العالم الحقيقي، مثل الموظفين والسيارات والحسابات المصرفية. يُعرّف الصنف خصائص وأساليب كائن من العالم الحقيقي، والكائن هو نسخة من الصنف.

المكونات الأساسية الثلاثة لمنهجية التوجه الكائني هي:

  • التحليل الموجه للكائنات – وظائف النظام
  • التصميم الموجه للكائنات - بنية النظام
  • البرمجة الشيئية – تنفيذ التطبيق

مبادئ البرمجة الشيئية

المبادئ الرئيسية الثلاثة للبرمجة الكائنية التوجه هي:

  • التغليف – يتعلق هذا بإخفاء تفاصيل التنفيذ والاكتفاء بعرض الطرق فقط. وتتمثل الأهداف الرئيسية للتغليف فيما يلي:
    • تقليل تعقيد تطوير البرامج - عن طريق إخفاء تفاصيل التنفيذ وكشف العمليات فقط، يصبح استخدام الفئة أمرًا سهلاً.
    • حماية الحالة الداخلية للكائن – يتم الوصول إلى متغيرات الفئة عبر طرق مثل get و set. هذا يجعل الفئة مرنة وسهلة الصيانة.
    • يسمح بتغيير التنفيذ الداخلي للفئة دون القلق بشأن تعطيل الكود الذي يستخدم الفئة.
  • وراثة – يتعلق هذا بالعلاقة بين الأصناف. تتخذ هذه العلاقة شكل صنف أب وصنف ابن. يستخدم الصنف الابن الطرق المُعرَّفة في الصنف الأب. والهدف الرئيسي من الوراثة هو:
    • إمكانية إعادة الاستخدام – يمكن لعدد من العناصر الفرعية أن ترث من نفس العنصر الأصل. وهذا مفيد للغاية عندما نحتاج إلى توفير وظائف مشتركة مثل إضافة البيانات وتحديثها وحذفها من قاعدة البيانات.
  • تعدد الأشكال – يتعلق هذا الأمر بوجود واجهة واحدة ذات تطبيقات متعددة ومختلفة. والهدف الرئيسي من تعدد الأشكال هو:
    • لتبسيط صيانة التطبيقات وجعلها أكثر قابلية للتوسيع.

وجه الفتاة Concepts في PHP

لغة PHP هي لغة برمجة نصية كائنية التوجه؛ وهي تدعم جميع المبادئ المذكورة أعلاه. وتتحقق هذه المبادئ من خلال:

  • التغليف – عبر استخدام طرق "get" و "set" ومعدلات الوصول.
  • وراثة – عن طريق استخدام الكلمة المفتاحية extends
  • تعدد الأشكال – عن طريق استخدام الكلمة المفتاحية للأدوات

الآن بعد أن أصبح لدينا المعرفة الأساسية بـ OOP وكيفية دعمها PHPدعونا نلقي نظرة على أمثلة تُطبّق المبادئ المذكورة أعلاه.

ما هو UML؟

لغة النمذجة الموحدة (UML) هي تقنية تستخدم لتصميم وتوثيق الأنظمة الموجهة للكائنات.

ينتج UML عددًا من المستندات، لكننا سنلقي نظرة على مخطط الفئات، وهو أمر مهم للغاية لبرمجة PHP الموجهة للكائنات.

مثال على مخطط الفئة

وجه الفتاة Concepts في PHP

مفتاح مخطط الفئة

  • استخدم الصندوق العلوي يحتوي على اسم الفئة
  • استخدم الصندوق الأوسط يحتوي على متغيرات الفئة
  • استخدم الصندوق السفلي يحتوي على أساليب الطبقة
  • استخدم ناقص (-) تعني العلامة نطاقًا خاصًا
  • استخدم زائد (+) علامة تعني النطاق العام
  • استخدم التجزئة (#) التوقيع يعني النطاق المحمي

كيفية إنشاء فئة في PHP

يتم استخدام الكلمة الأساسية class لتحديد فئة في PHP. فيما يلي قواعد إنشاء فئة في 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

لاحظ أن البقرة ترث من فئة الحيوان وتحدد متغيراتها وأساليبها الخاصة أيضًا.

لنقم الآن ببرمجة فئة البقرة.

<?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();
?>

اختبار تطبيقنا

لنستعرض الآن تطبيقنا في متصفح الويب.

الوراثة في PHP

يعيد كلا الكائنين استخدام طريقتي get_family و get_food الموروثتين من فئة Animal، مما يوضح عملية الوراثة عمليًا.

كيفية تطبيق تعدد الأشكال في لغة PHP

لنفترض أننا نريد تطوير تطبيق يتصل بمحركات قواعد بيانات مختلفة مثل MySQL و SQL الخادم، لكنه يستخدم نفس الواجهة الموحدة. يمكننا إنشاء واجهة تُعرّف الطرق القياسية وقيمة مطلقة.tracفئة t التي تنفذ الأساليب الشائعة.

  • السطح البيني - إنه مشابه لفئة. إنه يحدد فقط الأساليب والمعلمات.
  • ABStracفئة t - إنها فئة لا يمكن استخدامها لإنشاء كائن مباشرة. والغرض منه هو توفير تطبيقات جزئية أو كاملة للطرق الشائعة.

يوضح مخطط الفئات أدناه العلاقة بين فئتناtracفئة t، والواجهة، وفئات التنفيذ.

الوراثة في PHP

لنبدأ الآن في بناء عضلات البطن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);
?>

هذا هو تعدد الأشكال في العمل: تعمل استدعاءات الأساليب نفسها على أي برنامج تشغيل يقوم بتنفيذ الواجهة، لذلك لا يتغير الكود المحيط أبدًا عند تبديل محركات قواعد البيانات.

الأسئلة الشائعة

عضلات بطنtracيمكن للفئة t أن تحتوي على كل من الطرق والخصائص المُنفذة، ولا ترث الفئة إلا من أحدهما. أما الواجهة فتُعلن فقط عن توقيعات الطرق، ويمكن للفئة أن تُنفذ العديد منها. استخدم واجهة مطلقةtracفئة t لمشاركة التعليمات البرمجية، وواجهة لفرض شرطtract.

الركائز الأربع هي التغليف، والوراثة، وتعدد الأشكال، وabstracيركز هذا الدرس التعليمي على الثلاثة الأوائل؛tracيخفي tion التفاصيل المعقدة خلف واجهة بسيطة، والتي يدعمها PHP باستخدام abstracالفئات والواجهات.

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

نعم. أعطِ الذكاء الاصطناعي الحقول أو تعريف الجدول، وسيتمكن من إنتاج فئة ذات خصائص مكتوبة، ومنشئ، وطرق get و set. Revراجع الأنواع وأضف التحقق قبل استخدام الفئة.

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

تلخيص هذه التدوينة بـ: