oop - هل واجهات PHP لها خصائص؟




interface methods (5)

السبب [الصالحة] لحاجة الخصائص في واجهة هو تحديد أن فئة DTO لها جانب معين ، على سبيل المثال IOrderable {OrderDate، OrderStatus}، IDeliverable {DeliveryAddress، Route، ...} ، إلخ. يمكن استخدام الجانب في عدد من DTOs مثل أمر المبيعات ، أمر العمل ، فواتير المبيعات ، إلخ. يمكن أن تدعم فئة DTO جوانب متعددة ، أي الميراث المتعدد المرغوب في فئات البيانات (ولكن ليس فئات التعليمات البرمجية). بعد ذلك ، يتم تأكيد عميل DTO أنه يمكنه مشاهدة DTO عبر هذا الجانب (عقد واجهة). هذا النموذج يلتزم كل 5 من مبادئ SOLID.

في PHP الأقرب لديك لخصائص الواجهة هي سمات http://php.net/manual/en/language.oop5.traits.php . مماثلة لواجهات ، لا يمكن إنشاء سمات ، ومع ذلك يمكن استخدامها مباشرة في الفصول دون تنفيذها.

هل تحتوي واجهات PHP على خصائص ، أم أنها لا تحتوي إلا على طرق؟


ذلك يعتمد على ما تعنيه بكلمة "خصائص". إذا كنت تقصد الحقول الفعلية ، فعندئذ لا ، لا. إذا كنت تشير إلى خصائص مثل تلك الموجودة في C # ، فبإمكانك نعم (بما أن accessors (الخصائص) هي عبارة عن سكر نحوي بشكل صارم لطرق الملاءمة على أية حال). وينطبق نفس الأمر على الأحداث (على الرغم بالطبع ، في كل حالة ، لا يتم تحديد أي تنفيذ للحصول get / set أو add / remove الواصلين).

تحديث : بما أن PHP ليس لديها خصائص بمعنى get / set accessors ، فإن الإجابة على سؤالك لا. لا يمكن أن تحمل الواجهات بياناتها / حالتها الخاصة.


يمكن أن تحتوي واجهات PHP على ثوابت ، ولكنها ليست خصائص (متغيرات الحالة). إذا لم تكن بحاجة إلى تعديل "الملكية" ، يمكنك استخدام ثابت بدلاً من ذلك.


يمكن أن تحتوي واجهات PHP فقط على توقيعات الأسلوب العام بدون نص أسلوب. قد تحتوي أيضا على الثوابت. لكن هذا كل شيء. لا شيء آخر.

انظر php.net/manual/en/language.oop5.interfaces.php

يتم تعريف الواجهات باستخدام الكلمة الأساسية للواجهة ، بالطريقة نفسها التي تستخدمها الطبقة القياسية ، ولكن بدون أي من الطرق المحددة لمحتوياتها. […] يجب أن تكون جميع الطرق المعلنة في الواجهة عامة ، وهذه هي طبيعة الواجهة. […] من الممكن للواجهات أن يكون لها ثوابت. تعمل ثوابت الواجهة تمامًا مثل ثوابت الصفوف باستثناء أنه لا يمكن تجاوزها بواسطة فئة / واجهة توارثها.


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

1 - الملخص (أو الملخص الخالص) يهدف الفصل إلى تطبيق التسلسل الهرمي. إذا كانت عناصر عملك تبدو متشابهة بنيوياً إلى حد ما ، لتمثل نوع علاقة الوالدين والطفل (التسلسل الهرمي) فقط ، فستستخدم فئات الوراثة / الملخص. إذا لم يكن نموذج عملك يحتوي على تسلسل هرمي فلا ينبغي استخدام الميراث (هنا لا أتحدث عن منطق البرمجة ، على سبيل المثال ، تتطلب بعض أنماط التصميم الميراث). من الناحية المفاهيمية ، الطبقة المجردة هي طريقة لتنفيذ التسلسل الهرمي لنموذج الأعمال التجارية في OOP ، ولا علاقة لها بالواجهات ، وفي الواقع فإن مقارنة الطبقة المستخلصة مع الواجهة لا معنى لها لأن كليهما أمران مختلفان من الناحية المفاهيمية ، يُطلب من المقابلات فقط للتحقق من المفاهيم لأنها تبدو على حد سواء توفر نفس الوظيفة إلى حد ما عندما يتعلق الأمر بالتنفيذ ، ونحن المبرمجون عادة ما نركز أكثر على الترميز. [ضع هذا في الاعتبار أيضًا أن التجريد يختلف عن فئة الملخص].

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

في اعتقادي ، لم يتم اختراع الواجهات لتحقيق العديد من الميراث أو لفضح السلوك العام ، وبالمثل ، فإن الطبقات المجردة النقية ليست نقض واجهات لكن الواجهة هي وظيفة يستطيع الكائن القيام بها (عبر وظائف تلك الواجهة) و Class Abstract يمثل أصل التسلسل الهرمي لإنتاج الأطفال الذين لديهم بنية أساسية (خاصية + وظيفة) للوالدين

عندما يُسأل عن الفرق ، فهو في الواقع اختلاف مفاهيمي وليس الاختلاف في تنفيذ اللغة المحددة ما لم يُطلب بشكل صريح.

أعتقد أن كلا من المقابلين كانوا يتوقعون اختلاطًا مباشرًا بين هذين الفرقين وعندما فشلت ، حاولوا توجيهك نحو هذا الاختلاف من خلال تطبيق ONE على أنه الآخر

ماذا لو كان لديك فصل دراسي Abstract مع الأساليب المجردة فقط؟







php oop interface methods