بناء مشروع بطريقة البرمجة الكائنية (1)
ستكون هذه سلسلة من المواضيع التي تتحدث عن كيفية بناء مشروع php بسيط بطريقة البرمجة الكائنية ، إذا كنت لاتعلم ما هو مصطلح البرمجة الكائنية فهذا الموضوع لن يعلمك ماهية هذا المصطلح ، في الواقع هذا الموضوع موجه لاصحاب المستوى المتقدم او شبه المتقدم في البرمجة الكائنية التوجه ..
اذا كنت تريد بعض المواضيع التي قد تساعدك على فهم هذا المصطلح وكيفية البداية في تعلمه والدخول فيه فقم بالبحث في مواضيع القسم ..
المشروع سيكون عبارة عن برنامج لإدارة المهام بشكل بسيط ، ما أتحدث عنه هو برنامج مشابه لخدمة remember the milk بأبسط صورة ممكنة ، في أول موضوع سنقوم ببناء الأساس لهذا المشروع ، وفي السلاسل القادمة سنقوم باضافة تحديثات على المشروع ونشرح كيفية القيام بذلك ..
الهدف من هذا التمرين او التطبيق او مايحلو لك تسميته .. هو ايضاح قدارت البرمجة الكائنية بشكل عام ، اتحدث هنا عن سهولة تطوير المشروع لاحقاً ، القيام بمهمات معقدة داخلياً بأسطر معدودة ، كل هذا سيتم توضيحه ان شاء الله ..
أيضاً ستتعلم - ان لم تكن تعلم اصلاً - بعدم اعادة اختراع العجلة ، لاتقم ببرمجة شيء لمجرد البرمجة .. استفد من غيرك ، وعندما نتحدث عن عالم البرامج الحرة فنحن نتحدث عن بحر واسع من المشاريع والاشخاص الذين سبقوك في هذا المجال .. ، انا لا اقول ان تبحث عن script كامل لادارة المهام مثلاًَ وعدم البرمجة بنفسك ، انا اتحدث عن الاشياء الداخلية .. مثلاً : للتعامل مع قاعدة البيانات لديك خياران : ان تقوم ببرمجة class بنفسك يقوم بالتعامل مع القاعدة او ان تعتمد على نظام آخر قام ببرمجته شخص غيرك .. ، الـ captcha ، استخدام الـ javascript ، الـ cache ، نظم القوالب ، الى اخره من الاشياء التي هي عبارة عن اضافات وليس اساس .. ركز على كلمة اساس ، فليس كل مشروع يجب ان يستخدم نظام قوالب مثلاً لكنه يعتبر اضافة مهمة وتسهّل التعامل مع المشروع وتطويره مستقبلاً وهذا هو الهدف من التوجه الى البرمجة الكائنية ..
للبدء بالمشروع سنقوم بطرح سؤال بسيط .. ، كيف اقوم بإدارة المهام لدي بأبسط طريقة ؟ سؤال بسيط .. الاجابة بالطبع ابسط ، في العالم الحقيقي الواقعي فان ابسط طريقة هي احضار ورقة وقلم وتدوين المهمة ووضع علامة صح بجانبها في حال اكتمالها اليس كذلك ؟ حسناً لنقم بتحويل ذلك الى عالم البرمجة او لغة الحاسب او مهما اردت تسميتها .. عندما نقوم بالتحويل الان فإننا نتحدث عن تصميم قاعدة البيانات في هذا الحالة .. بما أن المشروع يختص بادارة المهام فمن الطبيعي ان يكون هناك جدول للمهام .. اذا سيكون لدينا جدول بإسم tasks ويحتوي على المهام ، وسؤال آخر .. هل هذا المشروع خاص بي وحدي ام للجميع ؟ اجابة هذا السؤال مهمة لتحديد منهج المشروع ، في حالتنا سيكون الجواب " للجميع " اذا من الطبيعي ان يكون هناك جدول آخر للمستخدمين بإسم users ونقوم بالربط بين كل مستخدم ومهماته الخاصه به ..
قاعدة البيانات ستكون من النوع mysql ، لنستعرض معاً تركيب الجدولين tasks و users ..
لدينا المفتاح الاساسي وهو الحقل id والذي يحمل قيم غير متشابهه او فريدة وتتم الكتابة في تلقائياً ، حقل لاسم المستخدم وهو حقل فريد .. حيث انه لا يمكن او لا يسمح بتواجد مستخدمين بنفس الاسم او على الاقل هذا ما اظنه او ما سنقوم باتباعه في هذا المشروع ، وحقل لكلمة سر المستخدم وتكون الكلمة مخزنة بعد تشفيرها عن طريق الـ md5 ، حقل للبريد الالكتروني وهو ايضاً حقل فريد ، الاسم الحقيقي للمستخدم ، هل عضوية المستخدم مفعّلة ام لا .. هذا الحقل يفيد في حالتين تحضرانني الان .. الاولى هي عندما يريد مستخدم ما حذف العضوية الخاصة به فاننا لا نقوم بحذف بيانات هذا العضو بل نقوم بالغاء تفعيل عضويته ونتيح له اماكنية اعادة تفعيل العضوية الخاصة به .. بمعنى انه لايوجد حذف للعضويات بل يوجد تفعيل/الغاء تفعيل للعضويات .. والحالة الاخرى هي في حالة اذا اردنا اضافة خاصية تفعيل العضوية عند التسجيل بواسطة البريد الالكتروني ، الحقل الاخير هو حقل لتاريخ انشاء السجل او العضوية ولا يتم تحديثه .. هذا الحقل ليس فريداً لانه توجد امكانية لان يقوم شخصين بالتسجيل في نفس الوقت والتاريخ .. اليس كذلك ؟كود:users: id(primary), username(unique), password(32), email(unique), real_name, active(0, 1), created(timestamp)
المفتاح الاساسي ، المفتاح الاجنبي وهو الحقل الذي يربط المهمة بالمستخدم الذي تندرج تحته ، عنوان او اسم او وصف المهمة ، ملاحظات على المهمة ، حالة المهمة وتكون اما منتهية او غير منتهية ، تاريخ انشاء المهمة وهو غير قابل للتحديث ..كود:tasks: id(primary), user_id(foreign), title, notes(text), case(completed, uncompleted), created(timestamp)
بالطبع هذه ليست ابسط طريقة لادارة المهام او دعنا نقل انها ليست ببساطة الورقة والقلم ، فمثلاً الحقول الاضافية مثل حقل الملاحظات و التاريخ ليست اساية على عكس الحقول الاخرى .. لكن عندما تتحدث عن البساطة في البرمجة فهذا التركيب للجدول يعد من ابسط التراكيب ..
فنحن لم نتطرق الى اهمية المهمة ، موقع المهمة ، تاريخ القيام بالمهمة .. وفي حالة المهمة توجد هناك حالتان بينما يمكننا وضع حالات مثل : مؤجلة ، ملغية ، الى آخره ..
كل هذه الخصائص يمكن اضافتها لكنها ستتطلب وقتاً وجهداً للقيام بذلك ، مثلاً الخدمة المقدمة من remember the milk تتيح لك ربط موقع المهمة بخرائط google ، وتتيح امكانية كتابة المهمة من عن طريق البريد الالكتروني بمعنى ان تقوم بارسال رسالة الى عنوان بريد الكتروني خاص بك وخاص باضافة المهام وتتم اضافة هذه المهمة بكل سهولة ، ايضاً يتيح ارسال رسائل sms للهواتف النقالة للتذكير بالمهمة في موعدها ..
الان نحن نتطرق لامكانية استخدام المشروع من خارج موقعه وهذا ما يدعى بـ " واجهة البرمجية التطبيقة " او ما يعرف بالـ API ، وان شاء الله سنضيف هذه الخاصية للمشروع مستقبلاً ..
انا لم اذكر خصائص خدمة الموقع remember the milk كدعاية له ، بل لتبيين الفرق بين بداية مشروع وما سيصبح عليه مع التطوير المستقبلي ، ومن يعلم فربما يأخذ احدهم هذا المشروع ويقوم بتطويره ليصبح مشروعاً متكاملا ..
نعود الان الى البرمجة ..
للتعامل مع قاعدة البيانات سنحتاج الى class يبسط لنا التعامل معه ، ما اقصده هو انه بدلاً من تكرار العمليات المعتادة للتعامل مع قواعد البيانات من النوع mysql كـ mysql_query, mysql_fetch_array, mysql_free_result ، وغيرها من الأوامر .. فاننا نقوم بانشاء دالة تقوم بهذه العملية بدلاً من التكرار .. هذا سيكون واضحا لك بعد قليل ان شاء الله ..
في هذا المشروع التعامل مع قواعد البيانات لن يكون معقداً ، لذلك لن نقوم باستخدام اداة تم برمجتها من قبل ، اعلم الان البعض يرى انه يوجد تناقض بينما قلته سابقاً عن عدم اعادة اختراع العجلة وبينما اقوله الان ، التفسير واضح .. اذا لم تكن بحاجة لاستخدام شيء معقد او يحتوي على مميزات كثيرة انت لست بحاجة لها فلا تقم باستخدامه ، مع انه من الاصح ان اقوم باستخدامها لانه يجعل البرنامج اكثر قابلية للتطوير .. عموماً نحن سنقوم ببرمجة class بسيط جداً يقوم بالتعامل مع قاعدة البيانات .. ، مع ملاحظة انه يمكن استبدال هذا الـ class بآخر يحتوي على مميزات اكثر ، هنا يظهر جلياً احدى مميزات البرمجة الكائنية وهي القابلية لتطوير بطريقة سهلة وفعّالة في نفس الوقت ..
بكل بساطة فان التعامل مع قاعدة البيانات هو عبارة عن اتصال بالقاعدة ومن ثم تطبيق استعلامات ( querys ) والحصول على نتائج .. حسناً لدينا الاستعلام الذي يجلب مجموعة من البيانات وذلك باستخدام select فنحن سنحتاج للتعامل مع هذه البيانات بطريقة منطقية وارجاعها بشكل واضح ، غالبية الاستعلامات الاخرى ( insert, update, delete ) تعيد احدى قيمتين وهما true في حالة نجاح الاستعلام او false في حالة عدم نجاحه .. وعلى هذا الاساس سنقوم ببناء الـ class ..
- قد يتسائل البعض عن السبب في كتابتي لكلمة " class " بدلاً من كلاس أو صِنف ، فالسبب في ذلك هو ان البعض قد لا يفهم معنى كلمة " صِنف " ، وانني لا احبذ التعريب الغير دقيق للكلمات الإنجليزية مثل : سكريبت ، كلاس .. لذلك اذكرها باللغة الانجليزية ..
في البداية قم بتحميل التطبيق والموجود في المرفقات ..
الان لنقم بإلقاء نظرة على تركيب الـ class الخاص بالتعامل مع قاعدة البيانات بالإسم mysql والموجود في المجلد classes بالاسم mysql.php ..
تلاحظون وجود متغيرين في الـ class وهما table_name وهو اسم الجدول الذي سيقوم الـ class بالتعامل معه .. والاخر هو db_link وهو مقبض الاتصال بقاعدة البيانات .. ايضاً تلاحظون وجود دوال واضحة التسمية وهي :
connect : وهي للاتصال بقاعدة البيانات وتحمل قيماً افتراضية يمكن تعديلها ..
disconnect : لقطع الاتصال بالقاعدة ..
get: تنفيذ استعلام لاحضار بيانات من قاعدة البيانات وتقوم هذه الدالة بفحص البيانات المعادة وتقوم بتنسيقها واعادتها على شكل مصفوفة .. كما تقوم باعادة الاستعلام وعدد نتائج الاستعلام ..
_count : حساب نتائج استعلام معين ..
set: تحديث سجل معين بدلالة معينة ..
remove: حذف سجل معين بدلالة معينة ..
query: تنفيذ استعلام معين ويمكن ان يعود بقيمة العنصر المُدخل ( insert id ) ..
الدوال set, remove, query تعود باحدى القيمتين true او false .. ، وجميع الدوال تعود بـ false او اظهار رسالة في حالة وجود خطأ ما ..
تلاحظون معي ان هذا الـ class بسيط جداً لكنه يحتوي على ما يكفينا .. اذا كانت لديك اي ملاحظات او اقتراحات على الـ class فلا تتردد بطرحها ..
ربما يلاحظ البعض انني لم اتوسع في شرح الـ class والسبب في ذلك ان الاوامر معروفة ومكررة ..
لنستعرض مثالا بسيطاً على هذا الصِنف ( سأبدأ بتسمية الـ class الى " صِنف " من الآن ) ..
النتيجة ستكون ..كود PHP:
$mysql = new mysql;
$mysql->connect();
$mysql->table_name = 'tasks';
print_r($mysql->get('select title from tasks'));
$mysql->disconnect();
هذا الصِنف يمكن ان يستخدم على اي جدول تقريباً ..كود:Array ( [rows] => Array ( [0] => going to school [1] => eating dinner with my friend [2] => recording a new twit episode [3] => rewriting jquery! [4] => watching tv [5] => writing a new post in my blog [6] => searching in google about "reuse" ) [count] => 7 [query] => select title from tasks )
إن شاء الله سأكمل لاحقاً ..