شرح البرمجة الكائنية PHP OOP من الصفر إلى الإحتراف - دورة كاملة في درس

كبداية لو قلت لك ماذا ترى بجانبك على اليمين أو على اليسار أو فوقك أو تحتك أو أمامك، على العموم ستقول بجواري أشياء كثيرة ولاحظ كلمة أشياء باللون الأحمر ..
ماهي هذه الأشياء التي بجوارك ؟

الإجابة على هذا السؤال ستختلف من شخص إلى أخر، فمنهم من سيقول بجواري دولاب ومنهم سيقول طابعة الكمبيوتر ومنهم سيقول النافذة وهكذا ...
إذًا كل هذه أشياء، ولو قمت أنت بفتح النافذة فإن أي شئ تقع عينك عليه فإنه يعتبر شئ (thing)، فهناك قاعدة تقول : كل شئ في هذه الدنيا هو كائن.


- ماهو الكائن (Object)؟

بالنسبة للجواب على هذا السؤال فأنا هنا لا أقصد تعريف الكائن في البرمجة ولكن تعريفه بشكل عام لأنك إذا فهمت التعريف فستبرمج بإحتراف في هذا المفهوم.
الكائن ببساطة هو شيء ! ( فيلسوف مش كده؟! :D )، شيء له خصائص Attributes و أساليب Methods.
 
- ما معنى خصائص؟
معنى كلمة خصائص هي أشياء موجودة في الكائن ولايستطيع أن ينفك عنها وتكون ملازمة للكائن.
 
- ما معنى أساليب؟
معنى أساليب هي أشياء يقوم بفعلها الكائن أي أشياء ينفذها الكائن.
سيكون مثالنا هو (الإنسان)، فهو شئ وهو كائن ايضاً، وبما أنه كائن فإن له أساليب وخصائص كما ذكرنا في القاعدة، إذا ماهي خصائص الإنسان وماهي أساليبه ؟.
خصائصه وهي الأشياء الملازمة له ولايستطيع ان ينفك عنها، مثل لون البشرة، الطول، الوزن، الحجم، العمر.
أساليب الإنسان، وهي حسب القاعدة الاشياء التي يقوم بها الكائن، مثل المشي، النوم، الجري.
العلاقة بين الخصائص والأساليب
كما ذكرنا سابقاً وهو أن أي كائن (Object) يتكون من أساليب (methods) و خصائص (attributes) ..
 
ملاحظة : يطلق على خصائص كلمة Attributes وفي بعض الأحيان تجدها بإسم Properties ..
التساؤل هنا : هل يوجد علاقة تربط بيط الأساليب والخصائص في كل كائن أم لا ؟
 
الجواب على هذا التساؤل سيكون بأخذ مثال بسيط .. فلو أخذنا كائن انسان وكان من احدى خصائص الإنسان الكتلة، وسنفرض أننا نتكلم عن إنسان بكتلة 100 كيلو جرام، السؤال الآن هل إذا قام الشخص صاحب هذا الوزن بإجراء عمليات إحماء وهرولة وجري فهل على مدار فترة زمنية معينة فهل ستبقى كتلته كما هو ؟
بالطبع ستقول لي لا لأنه قد يصبح مثلاً 93 كيلو جرام أي نقص ..
إذا بما أن الجري أسلوب والوزن خاصية إذاً فإن أسلوب الجري قام بالتأثير على خاصية الوزن إما بالإنقاص أو بالزيادة ...
ومن هنا نستنتج أنه هناك علاقة بين الخصائص والأساليب، وهذه العلاقة هي أن الأساليب التي يقوم بها كائن معين تؤثر على خصائص ذلك الكائن.
 
 
ولاتقلق عزيزي القارئ فكل ذلك سيتضح عندما نطبق الأمثلة ولكن أردت أن يكون البدء من الصفر ...
وهنا خلصنا إلى أنه هناك علاقة في أي كائن بين خصائصه وأساليبه أي أن الأساليب وهي الأعمال التي يقوم بها الكائن فإنها تؤثر على الخصائص وهي صفات ذلك الكائن ، ولترسيخ الفهم لو أخذت كائن سيارة وقلت أن كائن السيارة يسير بسرعة 60 كيلومتر إذًا لو سأل أحد وقال كم : فستجاوب وتقول 60 أي أن خاصية السرعة قيمتها 60 ...
طيب ماذا لو قمت بالضغط على دوّاسة البنزين .. فالجواب سيكون أنك زدت السرعة إلى سرعة معينة وهذا يعني أن من أساليب السيارة هي المشي وعندما تدوس أنت البنزين فإنك تمشي وتؤثر على خاصية السرعة إما بزيادة أو بنقصان.
 
أنت الآن ما تقوم به عند البرمجة عبر OOP هي شرح الكائن للحاسوب، حيث أنك تقوم بتحديد خصائص الكائن وأساليبه، لأن الحاسوب لن يدرك خصائص وأساليب هذا الكائن دون أن تقوم أنت بشرحه له، وتلك هي مهمتك الأولية.
 
لكن قد تتسائل، قد يكون لديّ أكثر من كائن لكنهم من نفس النوع ، فأنا وأنت وهي ونحن جميعًا كائنات من نوع واحد وهو (الإنسان) ونحن والهررة والكثير من الحيوانات ننتمي لأصل واحد وهي (الثدييات) ، فهل سأقوم بإعادة كتابة الخصائص والأساليب لكل كائن !
بالطبع لأ ! نحن كل ما سنقوم بفعله هو تحديد الخصائص العامة، مع عدم تحديد قيم لها، لأن كتلتي قد تختلف عن كتلتك ، ولأن لون بشرتي قد يختلف عن لون بشرتك، لكننا فى النهاية ستوجد خاصية مشتركة بيننا تختلف قيمها وهي (لون البشرة).
 
والآن إذا سألتك بما أن السيارة هي كائن، هل عندما تقوم السيارة بأسلوب ما وهو السير، هل ستبدأ فى السير عبر سرعة 10 ك/س مثلاً؟!
بالطبع لا، يجب أن يكون هناك سرعة إبتدائية V°، لذلك فإن لكل كائن اسلوب يقوم بالتحكم فى خصائصه، حيث يرجع قيم خصائصه إلى القيم الأولية حسب كل كائن، وهو ما يسمى بـConstructor، كذلك يوجد Destructor  وهو أسلوب آخر يقوم بتصفير القيم التي تم تعديل قيمها أثناء العمل بالكائن.
يجب ملاحظة أيضًا أن كل كائن يتكون من العديد من الكائنات الأخري، فالسيارة كائن تتكون من محرك، والمحرك هو كائن يحتوى على العديد من الكائنات، والإنسان هو كائن يتكون من أجهزة وهي كائنات يتكون كل منها على كائنات وهي الأعضاء، والأعضاء هي كائنات تتكون بدورها على العديد من الكائنات.
لذلك الكائنات لا تستطيع الإنتهاء من كتابة الخصائص والأساليب لها، وكلما كتبت أكثر كلما كان الكائن أكثر دقة.
 
 
- الخلاصة:
1- أن كل شئ في هذه الدنيا يعتبر كائن (Object) .
2- أن الكائن يتكون من خصائص (Attributes) و أساليب (Methods).
3- الخصائص هي الأشياء التي تكون ملازمة للكائن ولا يستطيع أن ينفك عنها .
4- الأساليب هي الأشياء التي يقوم بعملها أي كائن .
5- أن كل كائن توجد فيه علاقة بين خصائصه وأساليبه حيث أن الأعمال التي تقوم به الأساليب ستؤثر على قيم خصائص ذلك الكائن .
6- أني أقوم بشرح ووصف الكائن ووضع أساليبه وخصائصه لكي أشرحه للكمبيوتر .
7- أن الفصيلة هي مجموعة غير معروفة العدد من الكائنات بكلام أخر أن الفصيلة هي مجموعة من نفس الكائنات ولكن مختلفة في قيم الخصائص .
8- أن كل كائن معه أسلوبين من أساليبه المتعددة احدها يكون لتمهيد وبناء الكائن وأخر يكون لهدم وإنهاء الكائن .
9- أن الكائن قد يكون مكون من مجموعة من الكائنات .
10 - يمكن تمثيل هذا الكلام على الحاسوب بطرق مختلفة.
انت الآن تدرك الـObject Oriented Programming.

 

- الخطوة الأولى:
كما ذكرنا أثناء الشرح النظري فإن أول خطوة أقوم بها هي تفصيل الكائن الخاص بي وإستخراج خصائصه وأساليبه ، وهنا دعونا نتابع مع الموبايل.
والآن افرض اننا خرجنا بالأساليب والخصائص التالية للموبايل.
-الخصائص:
1- اللون.
2- الشركة المصنعة .
-الأساليب:
1-الإتصال.
2-قطع الإتصال.
الآن استخرجنا الذي نريده كما ذكرنا على الوق فما هي إذًا الخطوة الثانية؟
 

- الخطوة الثانية:
الخطوة الثانية هنا هي أن نقوم بشرح كائن الجوال للكمبيوتر فكيف يكون ذلك ؟
بالنسبة للخصائص : فإنه يتم تمثيلها في لغة البرمجة بالمتغيرات Variables
بالنسبة للأساليب : فإنه يتم تمثيلها في لغة البرمجة بالدوال functions ولكن عندما تكون الدالة داخل كائن فإنه يطلق عليها أسم Method .
إذاً عندما ذكرنا في الجزء النظري أن الكائن هو مجموعة من الخصائص والأساليب فهذا نظرياً أما كائن الكمبيوتر فسيكون هو عبارة عن مجموعة من المتغيرات والدوال.، أي إذا أردت تمثيل خاصية اللون الخاصة بالموبايل فسأقول:
بما أنها خاصية فإني سأمثلها بمتغير وستكون كالتالي :

$mobil_color = "red";
اما عن الأسلوب فسيكون عبارة عن دالة، بالشكل بالتالي:
function mobilConnect()
{
//do something here ..!
}
 

الآن بعد أن عرفنا أن الكائن في الكمبيوتر هو عبارة عن متغيرات ودوال (خصائص وأساليب) .
إذاً بقي علينا أن نعرف الطريقة التي سنشرح بها للكمبيوتر فكيف نحدد مجموعة المتغيرات والدوال لكائن معين؟
بكلام أخر كيف نقول للكمبيوتر : ترى لدينا كائن جوال فيه الخصائص كذا والمتغيرات كذا ؟
الجواب هو كلمة class في php .


ولكن ماهو الـ class؟
لن أقوم بإعطائك كلام فلسفي ولكن بإختصار هنا كلمة كلاس هي لتخبر لغة php أنك ستقوم الآن بشرح خصائص وأساليب كائن معين، بكلام أخر فإن كلاس هو الخريطة الخاصة بالكائن أي أنك تقول للكمبيوتر سأشرح لك الكائن الفلاني، أي بكلام اخر أيضاً فإن الكلاس هو الشرح الخاص بالكائن وهو المكان الذي تضع فيه الأساليب والخصائص الخاصة بكائن معين وهي المتغيرات والدوال، فيصبح الكلاس الآن هو عبارة عن مجموعة من المتغيرات والدوال، ومن هذا الكلاس أقوم بتعريف الكائنات التي أريدها مثل كائن لجوال نوكيا وكائن لجوال اريكسون لأني قمت بشرح كائن الجوال للغة php عن طريق كلمة كلاس، أي أن كلاس هو شرح لمواصفات الكائن، ولكن كيف أبدأ الشرح، في البداية ستكتب كلمة كلاس وبعدها إسم الكلاس الذي ستشرحه وهنا سيكون Mobil كالتالي:


class Mobil
{
//class content here
}
 
وستضع أنت المتغيرات والدوال التي تمثل الأساليب والخصائص لهذا الكائن بين قوسي {}، ملاحظة بالنسبة للمتغيرات داخل الكلاس فإن تعريفها يكون بإستخدام كلمة var، وهذا في php4 على الأقل؛ لذلك بما أن لدينا اللون والشركة المصنعة كخصائص والإتصال وقطع الإتصال كأساليب فسيكون شكل الكلاس كالتالي والذي سأقوم بشرحه للغة php :
 
class Mobil
{
//attributes
var $color;
var $company;
//methods
function Connect()
{
echo "connected ...!";
}
function DisConnect()
{
echo "disconnected...!";
}
}
 
- إنشاء الكائن بعد شرحه : ماهية new ؟
الآن أظن أننا شرحنا كيف سيكون شكل الكائن Mobil وفهمنا بي اتش بي أنه أي كائن من نوع Mobil، لكننا حتى الآن لم نقم بإنشاء كائن، نحن فقط قمنا بشرح فصيلة هذا الكائن، ولكن كيف نقوم بإنشاء كائن جديد؟
وإجابة هذا السؤال أن كل كائن يعبر عنه عن طريق متغير، ولكن قيمة هذا المتغير تحمل new ثم اسم الكلاس الذي قمنا بإنشاءه، مثل تلك الشيفرة:
$nokia = new Mobil();


الآن قمنا بإنشاء كائن يسمى nokia من التصنيف Mobile.
لكن كيف نستخدم الكائن؟ .. قد ذكرنا سابقاً أن إنشاء الكائن يتم كما رأينا بإستخدام كلمة new ..
ولقد أنشأنا كائن بإسم nokia الآن السؤال هنا هو كيف أستخدم الكائن nokia ؟
الجواب بكل بساطة فأنت عندما شرحت الكلاس Mobil فأنت تقول أي كائن يتم إنشائه من هذا الكلاس فإنه سيحتوي على دالتين هما Connect و DisConnect ومتغيرين هما color و company .
إذا فإن nokia سيحتوي على دالتين هما Connect و DisConnect و متغيرين هما color و company والسبب لأن المتغير أو الكائن nokia هو عبارة عن كائن من النوع Mobil، طيب السؤال الآن هو كيف أصل لهذه الدوال والمتغيرات الموجودة في كائن (متغير) nokia ؟


الجواب هو بإستخدام مايسمى بمعامل الكائن أو الـ Object Operator وهو عبارة عن شكل سهم كالتالي:

->
فمثلاً يمكنك الوصول إلى متغير اللون عبر تلك الشيفرة:
$nokia->color = "blue";
ويمكننا الوصول إلى اسلوب معين عبر تلك الشيفرة:
$nokia->Connect();

والآن لنتحدث قليلاً عن المتغير الداخلي this، ولمعرفة اهميتها دعنا نتأمل المثال التالي، لنفترض مثلاً انه موجود دالة بإسم mail فى لغة PHP، وانت قمت فى الكلاس بتعريف دالة تسمى mail ايضًا، لذلك سيحدث لبس عند إستدعاء تلك الدوال، كذلك الحال مع المتغيرات، فقد يكون فى برنامج متغير بإسم name ويوجد نفس المتغير بنفس الاسم فى الكلاس، ولذلك this تستخدم لتحديد المتغيرات والدوال بداخل الكلاس الخاص بك.


والآن لنتحدث عن الـConstructor، بالنسبة للبرمجة فهي عبارة عن دالة تكون داخل الكلاس وتقوم هذه الدالة بإجراء عمليات التمهيد مثل أن تستخدم الدالة هذه لتمهيد قيم المتغيرات عند بدء التعامل مع الكلاس ... وهي أول دالة يتم إستخدامها عند إنشاء الكائن وهذا ثابت.
أما بالنسبة للسؤال هنا : هو إذا كان الـ Constructor دالة فكيف يتعرف الكلاس على دالة معينة ضمن الدوال الموجودة فيه ؟


حقيقةً يختلف الجواب من php4 و php5 !!
ولكننا فى الوقت الحالي سنكتفي بـPHP4 فقط.
تكون دالة Constructor بنفس إسم الكلاس بالضبط حتى في شكل الحروف أي إذا كانت الحروف مكتوبة في اسم الكلاس بالصغير والكبير فيجب أن يكون إسم الدالة مطابق بالضبط.
الآن تخيل أن لدينا كلاس بإسم Image أي صورة وفي هذا الكلاس ولنفرض متغيرين هما w يمثل عرض الصورة مثلاً ومتغير بإسم h ويمثل الإرتفاع للصورة و هذا الكلاس يحتوي على دالتين بإسم
Image ويمثل الـ Constructor الخاص بالكلاس Image ولاحظ هنا أن هذه الدالة بنفس إسم الكلاس وتستخدم لأي شئ تريد عمله فهي دالة عادية مثلهامثل أي دالة ويمكنك كتابة ماتريده فيها ولكن عرفت على أنها دالة لتمهيد المتغيرات الخاصة بالكلاس وإجراء العمليات التمهيدية ولكن هذه ليست قاعدة ثابتة، Draw لرسم الصورة مثلاً
لذلك سنمهد المتغيرين h,w في الدالة Image وسيكون شكل الكلاس كالتالي :

class Image
{
var $w;
var $h;
function Image()
{
$this->w = 0;
$this->h = 0;
}
function Draw()
{
// do something here
}
}
الآن نريد إستخدام الكلاس Image ونريد أن ننشئ كائن بإسم pattern لذلك فإننا سنقوم بالتالي :
$pattern = new Image();
لاحظ الآن عندما أنشأت الكائن فإنك كتبت إسم الكلاس بعد كلمة new، في الحقيقة أنت كتبت إسم الكلاس نعم ولكن في حقيقة الأمر أنت تستدعي الدالة Image من ضمن الكلاس Image لذلك المتغير pattern ستكون قيمة h,w فيه هي 0 و 0 .
لذلك دائماً دالة الـ Constructor يتم إستدعائها عند إنشاء الكائن فقط.

الآن لو أردنا أن نجعل المستخدم هو من يعين طول وعرض الصورة فإننا نستطيع وضع باراميترين للدالة Image عند التمهيد وسيصبح شكل الكلاس مع الدالة Image كالتالي :
class Image
{
var $w;
var $h;

function Image($a,$b)
{
$this->w = $a;
$this->h = $b;
}
function Draw()
{
// do something here
}
}
ولاحظ أن المتغيرين h,w يتم تحديدهما بالمتغيرين a,b K الآن إذا أردت أن تنشئ كائن بإسم pattern كما ذكرنا فإنك ستنشئ الكائن كالتالي :
$pattern = new Image(72,120);


بالطبع الـOOP عالم واسع لا نستطيع إدراجه كله فى تلك التدوينة، ولكننا الآن قمنا بتغطية كل الأساسيات التي يحتاجها المبرمج للبدء فى البرمجة عبر الـOOP.
تحياتي لكم.
 

الدرس من تأليف المبرمج أحمد عصام

من مدونة المبرمج (توقفت في نهاية عام 2013) وتم نقل الدرس لتعم الفائدة

Share |

معلومات إضافية