يجب أن يكون لدى المبتدئين الكثير من الارتباك بشأن أنماط التصميم، اليوم هو عطلة نهاية الأسبوع، لذلك استغرقت بعض الوقت لكتابة مقال حول وضع القطعة الواحدة جنبًا إلى جنب مع وضع سلسلة الأوامر لإنشاء جوهر النظام المقالة بسيطة للغاية، وهذا برنامج تعليمي للمبتدئين، لأن الوقت ضيق (لا بد لي من الذهاب للتسوق مع زوجتي، هاها)، وهناك مخالفات في التصميم، ومخالفات في كتابة التعليمات البرمجية، وأخطاء، وما إلى ذلك. آمل أن يكون الجميع يمكن للأبطال الإشارة إليها من أجل الراحة. دعونا نحرز تقدمًا معًا. مستواي محدود. ^ _ ^
أعتقد أن الجميع قد قرأوا العديد من الكتب أو المقالات حول تطبيق أنماط التصميم في PHP، لكن القليل منهم يقدمون أمثلة مباشرة في حيرة من أمري بعد قراءتها، أشعر أنه بدون ممارسة المشروع، من الصعب معرفة جزء نمط التصميم
لتجنب أن تكون التعليمات البرمجية معقدة للغاية، ولا تتم إضافة معالجة الاستثناءات والمحتويات الأخرى.
للحصول على المعرفة الأساسية حول الوضع الفردي ووضع سلسلة الأوامر، يمكنك البحث عنها بنفسك في Google، ولن أخوض في التفاصيل مباشرةً:
<?php
/*
*@ الكاتب: لا الملائكة
*@الزمن: 30 أغسطس 2008
*/
واجهةIrunAction{
// احصل على الأساليب المحددة في الفصل والتي يمكن تشغيلها في التطبيق
وظيفة ثابتة LoadActions();
// يتم استخدام وظيفة الإدخال في الفصل لاستدعاء وظائف أخرى في الفصل
وظيفة runAction($action, $args);
}
/*
* الجزء الأساسي من نظام APP
*/
كلاس اب {
ثابت خاص $__instance = null;
ثابت خاص $__commands = array();
ثابت خاص $__flag = 1;
وظيفة خاصة __construct(){}
// يحصل تصميم الوضع أحادي القطعة على المثيل الوحيد لهذه الفئة
تحميل وظيفة ثابتة () {
if(self::$__instance == null) self::$__instance = new APP;
إرجاع الذات::$__instance;
}
// أضف تسمية إلى $__instance of APP في كل مرة تضيف فيها أمرًا جديدًا، تحقق مما إذا كان قد تمت إضافة مثيل لهذه الفئة من قبل.
// إذا كان هناك، فتجاهل العملية، وإذا لم يكن الأمر كذلك، فأضفها.
الوظيفة العامة addCommand($cmdName){
foreach(self::$__commands كـ $cmd){
إذا(strtolower(get_class($cmd)) == strtolower(get_class($cmdName))){
الذات::$__flag = 0;
استراحة؛
}
}
if(self::$__flag == 1) self::$__commands[] = $cmdName;
الذات::$__العلم = 1;
}
// يستدعي الجزء الأساسي من تصميم وضع سلسلة الأوامر وظيفة الإدخال الخاصة بالمثيل
// تحقق أولاً مما إذا كان استدعاء هذه العملية مسموحًا به في الفصل، وإذا لم يكن الأمر كذلك، فسوف يطالب بعملية غير محددة ويخرج.
الوظيفة العامة runCommand($action, $args){
الذات::$__flag = 0;
foreach(self::$__commands كـ $cmd){
إذا(in_array($action, $cmd->LoadActions())){
الذات::$__العلم = 1;
$cmd->runAction($action, $args);
}
}
إذا(الذات::$__العلم == 0){
الذات::$__العلم = 1;
خروج("إجراء غير محدد عن طريق الإجراء: $action");
}
}
// لحذف مثيل للفئة، ما عليك سوى تحديد اسم الفئة.
الوظيفة العامة RemoveCommand($className){
foreach(self::$__commands as $key=>$cmd){
إذا (strtolower(get_class($cmd)) == strtolower($className)){
unset(self::$__commands[$key]);
}
}
}
// ليقوم الجميع بالاختبار لمعرفة ما إذا كانت عملية الإضافة والحذف ناجحة
الوظيفة العامة viewCommands(){
echo(count(self::$__commands));
}
}
// مستخدم الفئة يطبق الواجهة IRunAction
فئة المستخدم تنفذ IRunAction{
// تحديد العمليات التي يمكن استدعاؤها
static Private $__actions = array('addUser', 'modifyUser', 'removeUser');
// احصل على العمليات التي يمكن استدعاؤها في العملية الفعلية، لا تحبك مباشرة، تم تصميم $__actions كمكالمة عامة.
// يجب عليك تصميم دالة LoadActions للحصول على قيمة $__actions
وظيفة عامة ثابتة LoadActions(){
إرجاع الذات::$__actions;
}
// قم بتشغيل الوظيفة المحددة
الوظيفة العامة runAction($action, $args){
// إذا كنت لا تفهم كيفية استخدام هذه الوظيفة، فيرجى الرجوع إلى الدليل.
call_user_func(array($this,$action), $args);
}
// مجرد وظيفة اختبارية
الوظيفة المحمية addUser($name){
صدى($اسم);
}
}
// مستخدم يشبه الاختبار
اختبار الطبقة ينفذ IRunAction {
static Private $__actions = array('addTest', 'modifyTest', 'removeTest');
وظيفة عامة ثابتة LoadActions(){
إرجاع الذات::$__actions;
}
الوظيفة العامة runAction($action, $args){
call_user_func(array($this,$action), $args);
}
الوظيفة المحمية addTest($name){
صدى($اسم);
}
}
//ما يلي هو رمز الاختبار
APP::Load()->addCommand(new User);
APP::Load()->addCommand(new User);
APP::Load()->addCommand(new User);
APP::Load()->addCommand(new User);
APP::Load()->runCommand('addUser', 'NoAngels');
APP::Load()->addCommand(new Test);
APP::Load()->runCommand('addTest', null);
تم تصميم فئة APP في الوضع الفردي، وهو الجزء الأساسي من النظام، وأعتقد أنك ستعرف من خلال النظر إلى الكود ما هي طريقة التحميل لتحميل مثيل فئة APP، وهو ما يعادل الطريقة الثابتة getInstance في بعض الكتب لديها ثلاث طرق عامة: addCommand، runCommand، وremoveCommand. runCommand هو أيضًا الجزء الأساسي من وضع سلسلة الأوامر راجع الكود المصدري للتنفيذ المحدد. الكود مكتوب بوضوح شديد ولن أخوض في التفاصيل هنا.
يقوم المستخدم والاختبار بتطبيق الواجهة IRunAction. تحدد كلا الفئتين متغيرًا خاصًا ثابتًا $__actions، وهو مصفوفة تحتوي على عمليات يمكن استدعاؤها بواسطة وظيفة runCommand الخاصة بالتطبيق.
وفيما يلي عملية تشغيل النظام:
بدء تشغيل التطبيق
-------addCommand، أضف الفئة التي تنتمي إليها العملية المراد تشغيلها إلى التطبيق. إذا تم تصميم الفئة المضافة باستخدام الوضع الفردي، فيمكنك إضافة addCommand(SingletonClass::Load()) على النحو التالي. بخلاف ذلك، يمكنك إضافته كما يلي استدعاء
addCommand(new someClass)
------- تشغيل عمليات runCommand. على سبيل المثال، هناك عملية addUser في فئة المستخدم، ويمكنني تمكين runCommand($acttion, $args) مباشرة من خلال مصفوفة الأوامر $__ في التطبيق هو مثيل لإحدى الفئات إذا كان لديك هذه العملية، فاستدعاء وظيفة runAction للمثيل. إذا لم تقم بإضافة مثيل لفئة معينة باستخدام addCommand، فستتم مطالبتك بعملية غير محددة والخروج.
يستدعي RunAction في فئة المستخدم والفئة call_user_func، وهي وظيفة شائعة الاستخدام تسمى
نصيحة: هذه هي نهاية الشرح والأمثلة. ما عليك سوى الاطلاع على ما تفهمه بنفسك وهو أنه يتعين عليك القيام بكل شيء بنفسك (ملاحظة: يمكن تحويله إلى ملف إدخال واحد في إطار العمل. ويعتمد تنفيذ MVC أم لا على ما تعتقده).