الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

[ درس متقدم ] كيفية بناء نظام Mvc بسيط باستخدام Php5

مغلق
بدأه hawy_php في 24 أغسطس 2007 · 2 رد · 859 مشاهدة · في منتدى تطوير المواقع بـ PHP
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

- بسم الله الرحمن الرحيم -

السلام عليكم ورحمة الله وبركاته

كيف تبني نظام ( Model – Controller – View )

المعروف ب MVC و ( المستخدم فى جميع اطارات العمل FrameWorks )

باستخدام PHP5 و أحد خصائص SPL ) Standard PHP Library )

وهي مكتبة تحتوي على مجموعة من الواجهات و الكائنات لحل بعض المشاكل القياسية

تحتاج لتطبيق هذا الدرس توفر نسخة PHP5 و مكتبة SPl المضافة افتراضيا فى نسخة PHP 5

* انصحك باستخدام Xampp 1.6.3a - يحتوي على نسخة PHP 5.2.3

وستجد هنا درس تسطيب xampp للاخ الفاضل اشرف السمهوري :rolleyes:

وان يكون لديك خلفية ولو بسيطة عن البرمجة الكائنية والوراثة

فى هذا الدرس ستتعلم ما هي اساسيات اى نظام MVC اكثر نمط تصميم شيوعا لتطبيقات الويب الكبيرة

وكيف تبني اساس هذا النظام من الصفر وكيفية التعامل معه .

@@ الجزء الاول – المقدمة و نقطة اساس النظام @@

------------------------------------------------------------

لنبدا بتوضيح احد اساسيات هذا النظام وهي ( صفحة واحدة تعالجنا { كلنا } :lol: )

- هما مين { كلنا } دول :angry:

اقولك انا دول كل العمليات الى هيتم معالجتها لاظهار المحتوي الذي تريده

فبدلا من ان تضع هذا السطر فى كل صفحة

<?php
include ("Global.php");
// بقية محتويات الكود الخاص بهذا الملف 
?>

سيكون عندنا صفحة تقوم بمعالجة كل العمليات لعرض المطلوب أى اننا لن نكون بحاجة لادراج ملف global.php مثلا فى كل ملف جديد نقوم بعمله

سنقوم الان ببداية التطبيق ، قم بعمل مجلد فارغ وليكن MVC ثم انشئ ملف فارغ باسم index.php

الان سنقوم بعمل بعض المهام التى سنحتاجها فى بداية معالجة العمليات ، قم بعمل مجلد includes

وانشئ ملف startup.php بداخله

ثم قم باضافة السطر التالى لملف ال index.php

include_once("includes/startup.php");

@ ------ نهاية الجزء الاول ----- @ يتبع .. B)

تم تعديل هذه المشاركة بواسطة hawy_php في 24 أغسطس 2007 في 17:17

#2

@@ الجزء الثاني - مهام البدء و كائن التسجيل @@

-----------------------------------------------------------

الجزئية الاولي - مهام البدء :

---------------------------------

ملف البداية يستخدم فى القيام ببعض مهام بداية التنفيذ العامة مثل تعريف الثوابت ،

و تحديد مستوي الاخطاء المراد تفعيلها ، الحصول على المسار الخاص بالاطار

سيكون الجزء الاول من ملف البداية startup.php بهذا الشكل

<?php

error_reporting (E_ALL);

$ver_error=' Sorry <br /> <h1> PHP 5 Only  !! </h1>';

if (version_compare(phpversion(), '5', '<') == true) { die ($ver_error); }

define ('DS', DIRECTORY_SEPARATOR);

$sitepath = realpath(dirname(__FILE__) . DS . '..' . DS) . DS; 

define ('site_path', $sitepath);

فى السطر الاول قمنا باعداد مستوي الاخطاء لاظهار جميع الاخطاء

لمزيد عن الاخطاء درس الاخطاء فى لغة PHP للاخ الفاضل أشرف السمهوري

http://www.tm-world.net/forum/showthread.php?t=462

ثم فى السطر الثاني قمنا بتنسيق رسالة تحذيرية لعرضها فى حالة عدم استخدام PHP5

نظرا لان النظام يعتمد بشكل اساسي على بعض ادوات SPL المتوفرة فى PHP5 فقط

فى السطر الثاالث نقوم بالتاكد من نسخة ال PHP اذا كانت اقل من 5 نقوم بايقاف التنفيذ

مع اظهار الرسالة السابق تنسيقها فى السطر الثاني

فى السطر الرابع نقوم بعمل ثابت DS يحتوي على فاصل الادلة DIRECTORY_SEPARATOR

وهو الباك سلاش [ \ ] لاختصار كتابته ليس اكثر

فى السطر الخامس نقوم بالحصول على مسار الموقع الحقيقي بهذه الطريقة

نقوم فى البداية بمعرفة اسم المجلدdirname للملف الحالى __FILE__ وهو فى حالتنا هنا startup.php

وسيكون اسم المجلد هو includes ثم نضيف \ ثم ال .. ليخرجونا للمجلد الاعلي من includes

وهو المجلد الرئيسي لنا MVC كما ذكرنا سابقا عند انشاء index.php

فى السطر السادس نقوم بعمل ثابت site_path يحتوي على قيمة المتغير المحتوي على مسار المجلد الرئيسي فى السطر الخامس $sitepath ليصبح عندنا الثابت site_path به مسار المجلد الرئيسي

كل ما فى هذا الملف سيتم تنفيذه فى بداية اى تنفيذ لاى ملف فى النظام .

الجزئية الثانية – كائن التسجيل :

------------------------------------

الجزء القادم هو احتياجنا لكائن تسجيل يقوم باحتواء كل البيانات العامة على النظام باكمله

هذا الكائن سيضمن داخل كل الكائنات المستقلة الاخري فى النظام ويستخدم لنقل البيانات العامة فى مختلف انحاء النظام بدون الاحتياج لاستخدام المتغير المسبق التعريف $GLOBALS

سنقوم بانشاء الكائن ( الكلاس ) هذا فى ملف خارجي وسنقوم باستدعائه ببساطة باستخدام include()

ولكن هيا نستخدم واحدة من روائع PHP5 الجديدة وهي الدالة [ __autoload() ]

هذه الدالة الساحرة تستخدم لتحميل الكائنات ( الكلاسات ) ، عندما تصادف PHP كائن غير موجود

فتقوم اولا باستدعاء الدالة __autoload() ، ثم تقوم بالاعلان عن خطا اذا لم يكن موجودا .

لنقم باضافة الكود الاتي الى ملف startup.php

function __autoload($class_name) 
{
		$filename = strtolower($class_name) . '.php';

		$file = site_path . 'classes' . DS . $filename; 

		if (file_exists($file) == false) 
		{ 
		   return false;
		}

		include ($file);
}

تاخذ الدالة اسم الكلاس كمعطي لها ، ثم تتاكد من وجود ملف له نفس الاسم بداخل مجلد الكائنات الذي نقوم بعمله وتسميته مثلا classes . اذا لم تجد الملف الدالة سوف تقوم بايقاف التنفيذ واظهار خطا قاتل fatal error يتم ايضاح فيه ان االكلاس ( اسم الكلاس ) غير موجود ،

واذا وجدت الملف ستقوم الدالة بتضمينه بواسطة include()

@@ انشاء كائن التسجيل :

-------------------------------

كائن التسجيل كما قلنا سابقا فهو يضمن داخل كل الكائنات المستقلة الاخري ويقوم بنقل البيانات العامة فى مختلف انحاء النظام ، وهو كائن (كلاس) بسيط جدا ، ولا يحتاج اكثر من ثلاثة اساليب (نهج) methods.

اولا نقوم بانشاء مجلد واسمه [ classes ] ثم نقوم بانشاء ملف جديد ونسميه [ regisrty.php ]

ونضع الكود الاتي بداخله

<?php
class Registry {
	private $vars = array();
}
?>

فى هذا السطر قمنا بانشاء الكائن ووضع خاصية vars على شكل مصفوفة وهي التى ستحوي البيانات التي سنقوم بتخزينها من خلال الكائن .

نحن الان قمنا بعمل هيكل لكائن التسجيل ( Registry Class ) ، و كل ما نريد فعله هو اضافة بعض الاساليب ( النهج ) ، جميع كائنات التسجيل تحتاج الى اسلوب تخزين set() لتخزين البيانات ،

واسلوب الإستخراجget() للحصول على البينات المخزنة ، ويمكننا ايضا اضافة اسلوب الحذف remove() ليقوم بحذف بعض البيانات المخزنة بالكائن ، سنضيف الكود الاتي الخاص بهذه الاساليب داخل الكائن :

function set($key, $var) {
	 if (isset($this->vars[$key]) == true) {
$error='Unable to set var <font color="red"><b> '.$key.'</b></font> Already Set  !!';
 die($error);
		} 
		$this->vars[$key] = $var;
		return true;
}
function get($key) {
		if (isset($this->vars[$key]) == false) {
				return null;
		}
		return $this->vars[$key];
}
function remove($var) {
		unset($this->vars[$key]);
}

الاساليب بسيطة جدا كل الى بتقوم بيه ( تخزن ، تستخرج و تحذف ) البيانات من خاصية$var ، فى اسلوب التخزين set() نقوم ايضا بالتاكد اذا كان مفتاح البيانات المدخلة موجود من قبل ام لا ، فاذا كان موجود نقوم بالخروج من البرنامج واظهار خطا وهذا يحمي من الكتابة على البيانات الموجودة من قبل [ Overwriting ] .

نحن الان بنينا كائن تسجيل كامل ولكن سنقوم باستخدام احد واجهات (وصلات) SPL وهي[ ArrayAccess]

وتعمل على الوصول للكائن بطريقة المصفوفات ، لاحظ الكود الاتي ولا تضيفه [ يعتمد على الكائن السابق] :

<?php
$registry = new Registry;
$registry->set ( 'site' , 'swalif.net' );

$registry->get ('site'); 

$registry['site'];
 ?>
[code]
فى السطر الاول نقوم بتعريف نسخة من كائن التسجيل  ، 
فى السطر الثاني نقوم بادخال مفتاح site  وقيمته swalif.net  

فى السطر الثالث نقوم بالحصول على قيمة المفتاح site  باستخدام اسلوب الاستخراج get() 

اما فى السطر الرابع فهو المقصود وهو نفس عمل السطر الثالث ( الحصول على قيمة المفتاح site  ) ولكن باستخدام ال ArrayAccess  فهي تتعامل مع $registry  كانه مصفوفة فى حين انه كائن ،
و ال ArrayAccess لا تمتلك مميزات حقيقية ، هي فقط  تختصر الكتابة بدلا من انك تستخدم  ->get()، 
لاستخدام ال ArrayAccess يجب علينا تغيير السطر الخاص بتعريف الكلاس وهو 

[code]
class Registry {

ليصبح

Class Registry Implements ArrayAccess {

الكلمة المفتاحية [ Implements ] تستخدم لتفيذ واجهة ( وصلة ) interface مثل ال ArrayAccess

بتنفيذ ArrayAccess يجب اضافة اربع اساليب جديدة ثابتة للكائن معرفة مسبقا من خلال SPL

قم باضافتهم اسفل الثلاث اساليب السابق ذكرهم

function offsetExists($offset) {
		return isset($this->vars[$offset]);
} 
function offsetGet($offset) {
		return $this->get($offset);
}
function offsetSet($offset, $value) {
		$this->set($offset, $value);
}
function offsetUnset($offset) {
		unset($this->vars[$offset]);
}

هذه الاساليب تشرح نفسها فالاولي تقوم بالتحقق من وجود المتغير والثانية تقوم باستخراج المتغير

والثالثة تقوم بادخال المتغير وقيمته والرابعة تقوم بالحذف

وللمزيد عنهم http://www.php.net/~helly/php/ext/spl/inte...rrayAccess.html

وللمزيد عن ال SPL بصفحة عامة http://www.php.net/manual/en/ref.spl.php

والمانوال الخاص باستخدامها وتشعباتها http://www.php.net/~helly/php/ext/spl/

بعد ان قمنا باستكمال كائن التسجيل واضافة واجهة ArrayAccess فان طريقة ادخال البيانات واستخراجها

اصبحت بالشكل التالي

$registry->set ('name','mohamed');
$registry['name'] = 'mohamed';
echo $registry->get ('name');
echo $registry['name'];

السطر الاول – ادخال البيانات بالطريقة العادية

السطر الثاني - ادخال البيانات باستخدام Array Access

السطر الثالث - استخراج البيانات بالطريقة العادية

السطر الرابع - استخراج البيانات باستخدام Array Access

------

يبقي الان اضافة هذا السطر فى نهاية ملف startup.php السالف ذكره ( بعد دالة autoload )

$registry = new Registry;

انتهينا من كائن التسجيل واذا حاولت تجربة النظام فسيعمل بدون اخطاء ( ولكن لن يعرض شئ ) :D

@ ------ نهاية الجزء الثاني ----- @

يتبع بالجزء الثالث B)

تم تعديل هذه المشاركة بواسطة hawy_php في 24 أغسطس 2007 في 17:28

#3

اسف جدا الاكواد مش راضية تطلع منسقة هنا ؟؟

ان شاء الله الدرس اكمله علشان يطلع منسق هنا

الموضوع منقول مني و الموضوع الاصلي http://www.swalif.net/softs/swalif45/softs205531/

تم تعديل هذه المشاركة بواسطة hawy_php في 24 أغسطس 2007 في 17:37

هذا الموضوع مغلق.

مواضيع مشابهة