البرمجة الكائنية PHP OOP
البرمجة الكائنية بكل بساطة هي اسلوب برمجي يقوم بجمع العمليات المتقاربة في كلاسات
ليسهل عملية إنشاء كود برمجي قوي و مرن و سهل التطوير بالمستقبل
مفهوم البرمجة الكائنية 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
سيكون الناتج كالتالي
باتباعك لهذه الخطوات البسيطة قمت عمل اول سكربت 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;
الآن قم بزايرة رابط الملف عن طريق المتصفح سيظهر لك التالي
تعريف أفعال الكلاس 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
قم بزيارة الملف من المتصفح لمشاهدة النتاج وهو كالتالي:
قوة 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();
الآن توجه للمتصفح لمشاهدة الناتج
سيكون كالتالي:
كما شاهدت في البرمجة الكائنية لاتوجد علاقة بين الكائن الأول و الثاني مع أن منشئهم كلاس واحد مما يجعل
من السهل صيانة وتطوير الكود في المستقبل فكل ماكان الكلاس مصمم بذكاء ومرونة يسمح لك بإنشاء كائنات
قوية مثل مخطط البيت كلما كان أفضل و أقوى و بذكاء كان المنزل الذي بني عليه أفضل وأقوى و أذكى
وسهل تطويره في المستقبل
بنهاية المقال هذه مقدمة بسيطة عن البرمجة الكائنية وسنطرق بمقالات قادمة لمواضيع أخرى بهذا الجانب
مثل Magic Methods و Inheritance و Visibility و Autoloading وبقية مواضيع البرمجة
الكائنية بإذن الله
أتمنى أن يكون المقال ذو فائدة لكم ولمشاريعكم المستقبيلة
التعليقات (4)
ممتاز ياعلي شرح ممتع ، يعطيك العافيه
ممتاز ياعلي شرح ممتع ، يعطيك العافيه
يعافيك ربي
يعطيك العافية أخوي علي عالشرح ..
عندي استفسار، مالفرق بين
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
)
)
شكراً لك على هذا الكلام المبسط .. استفدت منه كثيراً... :)
عرض المزيد.. جديد مقالاتي
لايوجد لديك حساب في عالم البرمجة؟
تحب تنضم لعالم البرمجة؟ وتنشئ عالمك الخاص، تنشر المقالات، الدورات، تشارك المبرمجين وتساعد الآخرين، اشترك الآن بخطوات يسيرة !