سؤال

أنا أبحث عن جيد, تنظيف طريقة للذهاب حول حقيقة أن PHP5 لا تزال لا تدعم الوراثة المتعددة.هنا هو التسلسل الهرمي فئة:

الرسالة
-- رسالة نصية
-------- InvitationTextMessage
-- EmailMessage
-------- InvitationEmailMessage

هذين النوعين من دعوة* دروس لديهم الكثير من القواسم المشتركة ، أحب أن يكون مشتركا الفئة الأصل, دعوة, أن كلا منهما يرث.للأسف, كما أن لديها الكثير من القواسم المشتركة مع الحالية الأجداد...رسالة نصية و EmailMessage.الكلاسيكية الرغبة في وراثة متعددة هنا.

ما أكثر خفيفة الوزن نهج حل المشكلة ؟

وذلك بفضل!

هل كانت مفيدة؟

المحلول

اسكندرية ، أكثر من مرة تحتاج متعددة الميراث هو إشارة وجوه الخاص بك هيكل إلى حد ما صحيحة.في الحالة المبينة أرى أن لديك الدرجة المسؤولية ببساطة واسع جدا.إذا كانت الرسالة هي جزء من تطبيق نموذج الأعمال التجارية ، فإنه لا ينبغي أن تأخذ الرعاية حول تقديم الإخراج.بدلا من ذلك, هل يمكن تقسيم المسؤولية واستخدام MessageDispatcher أن يرسل رسالة مرت باستخدام html أو نص الخلفية.انا لا اعرف الكود الخاص بك, ولكن اسمحوا لي أن محاكاة هذه الطريقة:

$m = new Message();
$m->type = 'text/html';
$m->from = 'John Doe <jdoe@yahoo.com>';
$m->to = 'Random Hacker <rh@gmail.com>';
$m->subject = 'Invitation email';
$m->importBody('invitation.html');

$d = new MessageDispatcher();
$d->dispatch($m);

وبهذه الطريقة يمكنك إضافة بعض التخصص إلى فئة الرسالة:

$htmlIM = new InvitationHTMLMessage(); // html type, subject and body configuration in constructor
$textIM = new InvitationTextMessage(); // text type, subject and body configuration in constructor

$d = new MessageDispatcher();
$d->dispatch($htmlIM);
$d->dispatch($textIM);

علما بأن MessageDispatcher أن اتخاذ قرار ما إذا كان إرسال HTML أو نص عادي اعتمادا على type الملكية في رسالة الكائن الذي تم تمريره.

// in MessageDispatcher class
public function dispatch(Message $m) {
    if ($m->type == 'text/plain') {
        $this->sendAsText($m);
    } elseif ($m->type == 'text/html') {
        $this->sendAsHTML($m);
    } else {
        throw new Exception("MIME type {$m->type} not supported");
    }
}

وباختصار ، فإن المسؤولية الانقسام بين فئتين.رسالة التكوين يتم في InvitationHTMLMessage/InvitationTextMessage صف إرسال خوارزمية تفوض إلى المرسل.وهذا ما يسمى نمط استراتيجية ، يمكنك قراءة المزيد على ذلك هنا.

نصائح أخرى

ربما يمكنك استبدال 'هو' العلاقة مع 'لديه' علاقة ؟ دعوة قد يكون رسالة ، لكنه لا تحتاج بالضرورة إلى 'هو' الرسالة.دعوة f.هـ.قد يكون المؤكدة التي لا تسير على ما يرام مع الرسالة نموذج.

البحث عن 'تكوين مقابلالميراث' إذا كنت بحاجة إلى معرفة المزيد عن ذلك.

إذا أنا يمكن أن اقتبس فيل في هذا الموضوع...

PHP, مثل جافا ، لا تدعم الوراثة المتعددة.

يأتي في PHP 5.4 سوف يكون الصفات التي تحاول تقديم حل أن هذه المشكلة.

في غضون ذلك ، سوف يكون من الأفضل إعادة التفكير في الفئة الخاصة بك تصميم.لك يمكن تنفيذ واجهات متعددة إذا كنت بعد موسعة API الفصول الدراسية.

و كريس....

PHP لا تدعم الوراثة المتعددة ، ولكن هناك بعض (فوضوي إلى حد ما) سبل تنفيذ ذلك.تحقق من هذا الرابط لبعض أمثلة:

http://www.jasny.net/articles/how-i-php-multiple-inheritance/

يعتقد أنهما قد روابط مفيدة.لا يمكن أن تنتظر لمحاولة الخروج من الصفات أو ربما بعض mixins...

في Symfony إطار لديها mixin المساعد لهذا, ، قد ترغب في التحقق من ذلك -- حتى مجرد أفكار ، إذا عدم استخدامه.

"تصميم نمط" الجواب هو مجردة المشتركة وظائف في عنصر مستقل ، ويؤلف في وقت التشغيل.التفكير بطريقة مجردة الدعوة وظيفة الخروج كما الدرجة التي يحصل المرتبطة رسالتك الطبقات في بعض طريقة أخرى من الميراث.

أنا باستخدام الصفات في PHP 5.4 مثل طريقة حل هذه.http://php.net/manual/en/language.oop5.traits.php

هذا يسمح الكلاسيكية الميراث مع يمتد, ولكن أيضا يعطي احتمال وضع مشتركة وظائف و خصائص في 'سمة'.كما يقول دليل:

الصفات هي آلية إعادة استخدام التعليمات البرمجية في الميراث واحدة من اللغات مثل PHP.سمة يهدف إلى الحد من بعض القيود من الميراث واحدة من خلال تمكين المطور إلى إعادة استخدام مجموعات من طرق بحرية في عدة مستقلة فئات مختلفة في الطبقة الهرمية.

يبدو نمط الديكور قد تكون مناسبة ولكن من الصعب أن أقول من دون مزيد من التفاصيل.

هذا هو السؤال و الحل....

ماذا عن السحرية _المكالمة () ، _get () __مجموعة() الأساليب ؟ أنا لم تختبر بعد هذا الحل ولكن ما إذا كان يمكنك جعل multiInherit الدرجة.محمية متغير في الطفل فئة يمكن أن تحتوي على مجموعة من الطبقات وراثة.منشئ في متعددة واجهة الطبقة يمكن أن تخلق حالات من كل الطبقات التي يتم ورثت وربطها الملكية الخاصة ، ويقول _ext.فإن __استدعاء الأسلوب() يمكن استخدام method_exists() دالة على كل الطبقات في _ext مجموعة لتحديد الأسلوب الصحيح للدعوة.__الحصول على() و __مجموعة يمكن استخدامها لتحديد موقع الداخلية الخصائص ، أو إذا كان خبيرا مع إشارات يمكن أن تجعل خصائص الطفل فئة موروثة الطبقات تكون إشارات إلى نفس البيانات.متعددة الميراث من وجوه الخاص بك سوف تكون شفافة إلى التعليمات البرمجية باستخدام هذه الكائنات.أيضا, الداخلية الكائنات يمكن الوصول إلى توريث الكائنات مباشرة إذا لزم الأمر طالما _ext مجموعة يتم فهرستها من قبل اسم الفئة.لدي تصور خلق هذا الطراز السوبر والتي لم تنفذ بعد كما أشعر أنه إذا كان يعمل أكثر مما يمكن أن يؤدي إلى تطوير بعض تختلف عادات سيئة البرمجة.

لدي بعض الأسئلة لتوضيح ما تقوم به:

1) هل لديك رسالة كائن فقط تحتوي على رسالة مثلاالجسم, المتلقي, الجدول الزمني الوقت ؟ 2) ماذا تنوي أن تفعل مع دعوة الكائن ؟ أنها لا تحتاج إلى معاملة خاصة مقارنة EmailMessage?3) إذا كان الأمر كذلك ما هو خاص جدا حول ذلك ؟ 4) إذا كان هذا هو الحال لماذا لا أنواع الرسائل ضرورة التعامل مع مختلف عن دعوة ؟ 5) ما إذا كنت تريد أن ترسل رسالة ترحيب أو موافق الرسالة ؟ هل هم كائنات جديدة أيضا ؟

يبدو وكأنها تحاول الجمع بين الكثير من الوظائف في مجموعة من الأشياء التي يجب فقط أن يكون المعنية مع عقد محتويات الرسالة - وليس كيف ينبغي التعامل معها.لي, ترى, لا يوجد فرق بين دعوة أو رسالة القياسية.إذا كانت الدعوة يتطلب معالجة خاصة ، فإن ذلك يعني تطبيق المنطق وليس نوع الرسالة.

على سبيل المثال:نظام بنيت مشتركة قاعدة كائن الرسائل التي تم تمديدها إلى الرسائل القصيرة, البريد الإلكتروني, وغيرها من أنواع الرسائل.ومع ذلك:ولم تكن هذه تمديد - رسالة دعوة ببساطة محددة مسبقا النص ليتم إرسالها عبر رسالة من نوع البريد الإلكتروني.دعوة خاصة التطبيق سوف تكون قلقة مع التحقق من صحة و المتطلبات الأخرى للحصول على دعوة.بعد كل شيء, كل ما تريد القيام به هو إرسال رسالة X المتلقي Y التي ينبغي أن تكون منفصلة في حد ذاتها.

نفس المشكلة مثل جافا.حاول استخدام واجهات مع خلاصة وظائف من أجل حل تلك المشكلة

PHP يدعم الواجهات.هذا يمكن أن يكون رهان جيد ، اعتمادا على استخدام الحالات.

ماذا عن دعوة الطبقة تحت الرسالة الصف ؟

وبالتالي فإن التسلسل الهرمي المثل:

الرسالة
--- دعوة
------ TextMessage
------ EmailMessage

و في دعوة الطبقة ، إضافة الوظائف التي كانت في InvitationTextMessage و InvitationEmailMessage.

وأنا أعلم أن الدعوة ليست في الحقيقة نوع من الرسالة انها اكثر من وظيفة الرسالة.لذلك أنا لست متأكدا إذا كان هذا هو جيدة أو تصميم أو لا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top