البرمجة الكائنية PHP OOP

Ali Majrashiمنذ 8 سنوات

البرمجة الكائنية بكل بساطة هي اسلوب برمجي يقوم بجمع العمليات المتقاربة في كلاسات
ليسهل عملية إنشاء كود برمجي قوي و مرن و سهل التطوير بالمستقبل

مفهوم البرمجة الكائنية Object Orinted Programming

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

Don't Repeat Yourself (DRY)

وظيفة هذا المبدأ في تطوير البرمجيات ان يحد من عملية تكرار كتابة نفس الأكواد اكثر من مرة لنفس البرنامج
وفائدة هذا المبدأ تتضح في البرمجيات ذات المعمارية متعددة المستويات multi-tier architectures
ومن أهم فوائد مبدأ DRY Programming عندما ترغب بتعديل معلومة او وظيفة في البرنامج
فغالبا انك ستقوم بتعديل واحد لتحديث طريقة عمل الكود

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

البرمجة الكائنية OOP يتخوف منه كثير من مبرمجي PHP وخاصه أنه تم تقديمها بصدور النسخة 5 من PHP
فبعد ان تعود مطوري PHP على الطرق التقليدية procedural code في البرمجة ويشاهد
لاول مرة البرمجة الكائنية ويرى بنية جديدة للبرمجة فيعتقد أنها صعبة التعليم وليست
بسهولة البرمجة التقليدية procedural code ولكن بالواقع البرمجة الكائنية
جدا واضحة وأسهل من البرمجة التقليدية

فهم الكائن Object و الكلاس class

قبل الغوص بعالم البرمجة الكائنية يجب عليك فهم الفرق بين الكائن Object و الكلاس Class بشكل مبسط و واضح
بهذا المقال سنوضح الفروق بشكل مبسط و طرق إنشائهم وطرق بناء الخصائص Properties والأفعال Methods
وطرق إستخدامها ببساطة 

الفرق بين الكائنات Objects و الكلاسات classes

تعريف مبسط: الكلاس يشكل هيكلة البيانات و الأفعال و يستخدم هذه المعلومات لبناء الكائن 

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

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

تستطيع بناء أكثر من كائن من نفس الكلاس وبنفس الوقت لاتربطهم أي علاقة ببعض فلو اتبعنا الأمثلة السابقة 
نستطيع بناء 50 منزل بمخطط واحد جميعهم يتشابهون بالشكل و لكن يختلفون بالعوائل التي تسكن بها
و الديكورات الداخليه على حسب استخدام كل عائلة

إنشاء الكلاسات

عملية إنشاء كلاس جدا واضحة بكل سهولة تستطيع استخدام كلمة class متبوعة باسم الكلاس
و قوسين معقوفة curly braces {} 

مثال:


<?php

class SimpleClass
{
    // Class properties and methods can be declared here
}

عند إنشاء الكلاس تستطيع عمل نسخة منه وتخزينه في متغير بإستخدام الكلمة new 

مثال:


$object = new SimpleClass;

لمشاهدة محتوى الكلاس المخزن في المتغير سوف نستخدم الدالة  var_dump

مثال:


var_dump($object);

الآن قم بتجيمع هذه الأمثلة بملف بي اتش بي بمسمى test.php وقم بحفظه داخل مجلد باسم oop 
بالسيرفر المحلي بجهازك لتجربة الكود ليصبح الكود بالشكل التالي:


<?php

class SimpleClass
{
    // Class properties and methods can be declared here
}

$object = new SimpleClass;

var_dump($object);

ثم قم بفتح الملف عن طريق المتصفح بزيارة العنوان http://localhost/oop/test.php

سيكون الناتج كالتالي

class-defined.png

باتباعك لهذه الخطوات البسيطة قمت عمل اول سكربت OOP لك

تعريف خصائص الكلاس Class Properties

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

لتعريف property إلى الكلاس SimpleClass قم بإضافة هذا الكود داخل الكود السابق 


public $property = "I'm a class property!";

ليصبح الكود كالتالي:


<?php

class SimpleClass
{
    public $property = "I'm a class property!";
}

$object = new SimpleClass;

var_dump($object);

يتم استخدام الكلمة public لتحديد مستوى رؤية الخصائص والأفعال
سيتم طرحها بمقال آخر لتوضيحها ببساطة

يتم تسمية الخاصية Property بنفس قوانين تسمية المتغيرات المتبعة في PHP
ويتم تعيين قيمة له 

ملاحظة: أنت لست مجبر لإدخال قيم للخصائص يمكن تركها فارغة

لقرائة محتوى الخاصية Property و طباعة محتواها للمتصفح تستطيع إستخدام الدالة echo


echo $object->property;

لاحظ هنا قمنا بتحديد إسم الكائن ثم استخدمنا السهم <- وبعدها ادخلنا اسم الخاصية Property لطباعتها
وهنا تحديد اسم الكائن مطلب ظروري كما قلنا سابقا انه يمكن عمل اكثر من كائن من نفس الكلاس
و إذا لم نحدد اسم الكائن الذي نرغب بدخول احد خصائصه او افعاله ستحصل على خطأ حيث ان PHP
لن تستطيع تحديد الكائن الذي نرغب بدخول محتواه والتعامل معه

استخدام علامة السهم <- وهي من أسس البرمجة الكائنية OOP بحيث انها تسمح لك الدخول على
خصائص Properties وأفعال Methods أي كائن

الآن قم بالتعديل على الكود داخل الملف test.php واستبدل الدالة var_dump بـ echo
لقرائة وطباعة الخاصية Property بدل طباعة جميع محتوى الكلاس

ليصبح الكود كالتالي:


<?php

class SimpleClass
{
    public $property = "I'm a class property!";
}

$object = new SimpleClass;

echo $object->property;

الآن قم بزايرة رابط الملف عن طريق المتصفح سيظهر لك التالي

echo-property.png

تعريف أفعال الكلاس Class Methods 

الأفعال Methods وهي الدوال التي يتم تعريفها داخل الدالة. بمعنى آخر اي عمل او نشاط
يستطيع الكائن تنفيذه يتم تعريفه داخل الكلاس كأفعال Methods.

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

قم بإضافة التالي للكود السابق 


    public function setProperty($newValue)
	  {
	      $this->property = $newValue;
	  }
 
  	public function getProperty()
	  {
	      return $this->property . "<br />";
	  }

ليصبح الكود كالتالي:


<?php

class SimpleClass
{
    public $property = "I'm a class property!";

    public function setProperty($newValue)
	  {
	      $this->property = $newValue;
	  }
 
  	public function getProperty()
	  {
	      return $this->property . "<br />";
	  }
}

$object = new SimpleClass;

echo $object->property;

ملاحظة: للتعامل مع الخصائص Properties و الأفعال Methods خارج الكلاس كنا نستخدم
إسم الكائن ثم السهم ثم اسم الخاصية او الفعل ولكن داخل الكائن تستطيع التعامل مع اي
من الأفعال او الخصائص باستخدام this$ ثم إلسهم ثم اسم الفعل او الخاصية 

والسبب يعود ان اسم الكائن غير ثابت كما تعلمنا اننا نستطيع إنشاء أكثر من كائن لنفس الكلاس
و لتفادي مشكلة تعدد الإستخدام تم وضع مرجع ثابت داخل الكلاس يعود باسم الكائن وهو this$

الآن سنقوم بقرائة قيمة الخاصية باستخدام الفعل getProperty ونطبعها للمتصفح
ثم نقوم بتغيير قيمة الخاصية property$ باستخدام الفعل setProperty
ثم نقوم بطباعة القيمه مرة أخرى للمتصفح 

قم بتعديل الكود السابق باستبدال ليصبح كالتالي 


<?php

class SimpleClass
{
    public $property = "I'm a class property!";

    public function setProperty($newValue)
	  {
	      $this->property = $newValue;
	  }
 
  	public function getProperty()
	  {
	      return $this->property . "<br />";
	  }
}

$object = new SimpleClass;

echo $object->getProperty(); // Get the property value and print it
 
$object->setProperty("I'm a new class property value!"); // Set a new value
 
echo $object->getProperty(); // Read it out again to show the change
 

قم بزيارة الملف من المتصفح لمشاهدة النتاج وهو كالتالي:

methods-calls.png

قوة OOP تظهر عند إستخدام كلاس class واحد لإنشاء أكثر من كائن Object

سنقوم بتعديل بسيط على ملف test.php
ونقوم بإنشاء كائنين
ونقوم بطباعة خصائصهم
ومن ثم تعديلها
وبالأخير طباعتهم مرة أخرى لمشاهدة الفرق

قم بتغير محتوى الملف ليصبح كالتالي :


<?php

class SimpleClass
{
    public $property = "I'm a class property!";

    public function setProperty($newValue)
	  {
	      $this->property = $newValue;
	  }
 
  	public function getProperty()
	  {
	      return $this->property . "<br />";
	  }
}

// Create 2 Objects From The Same Class
$object = new SimpleClass;
$object2 = new SimpleClass;

// Print The Value of $property Of Both Objects
echo $object->getProperty(); 
echo $object2->getProperty();
 
// Set New Values For Both Objects 
$object->setProperty("I belong to the First instance!");
$object2->setProperty("I belong to the Second instance!");
 
// Print The Value of $property Of Both Objects Again
echo $object->getProperty(); 
echo $object2->getProperty();
 

الآن توجه للمتصفح لمشاهدة الناتج 

سيكون كالتالي:

object-power.png

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

 

بنهاية المقال هذه مقدمة بسيطة عن البرمجة الكائنية وسنطرق بمقالات قادمة لمواضيع أخرى بهذا الجانب
مثل Magic Methods و Inheritance و Visibility و Autoloading وبقية مواضيع البرمجة
الكائنية بإذن الله

أتمنى أن يكون المقال ذو فائدة لكم ولمشاريعكم المستقبيلة

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

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

محمود الزهراني:

ممتاز ياعلي شرح ممتع ، يعطيك العافيه :)

a_alshamiri:

يعطيك العافية أخوي علي عالشرح ..

عندي استفسار، مالفرق بين 

var_dump

و

print_r

 

Ali Majrashi:

ممتاز ياعلي شرح ممتع ، يعطيك العافيه :)

يعافيك ربي 

يعطيك العافية أخوي علي عالشرح ..

عندي استفسار، مالفرق بين 

var_dump

و

print_r

 

يعافيك ربي 

الفرق جدا بسيط

الدالة var_dump 

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

<?php
$a = array(1, 2, array("a", "b", "c"));
var_dump($a);
?>

الناتج راح يكون

array(3) {
  [0]=>
  int(1)
  [1]=>
  int(2)
  [2]=>
  array(3) {
    [0]=>
    string(1) "a"
    [1]=>
    string(1) "b"
    [2]=>
    string(1) "c"
  }
}

الدالة print_r

راح تطبع معلومات اقل مثل نوع المتغير ومحتواه فقط وان كنت تتعامل مع مصفوفة مثلا راح يطبع المحتوى المفتاح والقيمة ولكن بدون النوع ولكن بشكل أفضل ومقروء للبشر human-readable  

<pre>
<?php
$a = array ('a' => 'apple', 'b' => 'banana', 'c' => array ('x', 'y', 'z'));
print_r ($a);
?>
</pre>

الناتج كالتالي 

Array
(
    [a] => apple
    [b] => banana
    [c] => Array
        (
            [0] => x
            [1] => y
            [2] => z
        )
)

 

Abdulhamid Kwieder:

شكراً لك على هذا الكلام المبسط .. استفدت منه كثيراً... :) 

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

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