في php ، كما هو الحال في معظم لغات OOP الأخرى ، هناك معدلات رؤية. هذه هي الكلمات الرئيسية العامة والمحمية والخاصة. لكنها تنطبق حصرياً على الخصائص أو الأساليب أو الثوابت. ترتبط هذه المعدلات بشكل وثيق بالقدرة على تغليف البيانات. تجدر الإشارة إلى أنه في لغات مثل java ، C # ، اذهب ( https://golang.org/doc/go1.4#internalpackages ) ، ruby ( https://habr.com/post/419969/ ) ، crystal ( https : //crystal-lang.org/reference/syntax_and_semantics/visibility.html ) من الممكن الحد من نطاق الحزم (الحزم) أو الفئات / الأنواع. في php لا توجد طريقة للحد من نطاق الفئات - أي فئة متصلة يمكن الوصول إليها من أي فئة أخرى. ومع ذلك ، يمكنك محاكاة هذه الميزة باستخدام العديد من الحيل.
لماذا قد تكون هناك حاجة للاختباء على مستوى الصف:
- فئات الخدمة (المساعدون) في المكتبة - لا تتناثر في واجهة برمجة تطبيقات المكتبة بفئات داخلية لا معنى لها.
- تغليف بإخفاء الكائنات الداخلية لـ "منطق الأعمال" ، على سبيل المثال ، حظر الإنشاء المباشر للكائنات التابعة التي تتجاوز فئة أكثر عمومية.
بشكل منفصل ، يمكننا تمييز قسم الطبقات "الكبيرة" إلى أشياء صغيرة. من الممارسات الجيدة الحد من تعقيد (وعدد الخطوط) لكل من الأساليب والفئات الفردية. يذهب عدد الأسطر هنا كواحد من العلامات التي تأخذ بها طريقة الفصل أو الفصل نفسه مسؤولية غير ضرورية. عند إعادة بناء طريقة عامة ، ننقل أجزاء منها إلى طرق خاصة / محمية. لكن عندما ينمو الفصل لسبب أو لآخر ونفصل كيانًا منفصلاً عنه ، يتم نقل هذه الفئات الخاصة / المحمية جدًا إلى فصل منفصل ، وبالتالي نفتح بشكل غير مباشر الوصول إلى الطرق التي كانت تقتصر سابقًا على نطاق فئة واحدة.
الآن الأساليب الفعلية لمحاكاة التستر أنفسهم.
باستخدام تعليقات PHPDoc ، يمكنك تعليم فئة أو سمة أو واجهة على أنها internal
( http://docs.phpdoc.org/references/phpdoc/tags/internal.html ). ومع ذلك ، يمكن لبعض IDEs (مثل PhpStorm) فهم مثل هذه التسميات.
في وقت التشغيل ، يمكنك التحقق من المكان الذي تم استدعاء مُنشئ الفصل الدراسي منه. على سبيل المثال ، من خلال طريقة debug_backtrace
( http://php.net/manual/ru/function.debug-backtrace.php ) أو استخدام وظيفة Xdebug المماثلة للتحكم في الكود في بيئة dev \ test. مثال على حل رسمي هنا ( https://coderwall.com/p/ixvnga/how-emulates-private-class-concept-in-php ).
باستخدام debug_backtrace final class PrivateClass { private $allowedConsumer = 'AllowedPrivateClassConsumer'; public function __construct() { $builder = debug_backtrace(); if (count($builder) < 2 || !isset($builder[1]['class']) || $builder[1]['class'] !== $this->allowedConsumer) { throw new Exception('Need to be instantiated by '.$this->allowedConsumer); } } }
استخدم فصول مجهولة
وظيفة جديدة نسبيا في php هي فصول مجهولة ( http://php.net/manual/ru/language.oop5.anonymous.php ). بعد وصف الفئة المجهولة داخل الطريقة المحمية ، نسعى لإخفائها. حتى لا تحدث فوضى لتعريف فئة داخل دالة ، يمكنك وصف الفئة "الخاصة" في ملف منفصل على أنها مجردة ، وتوسيعها بالفعل في تعريف فئة مجهولة. مثال جيد لاستخدام هذه الطريقة هو في هذا الرابط ( https://markbakeruk.net/2018/06/25/using-php-anonymous-classes-as-package-private-classes/ ).
استنادًا إلى المادة التي تم العثور عليها ، من الواضح أن وظيفة إخفاء الفئات أمر مطلوب بطريقة ما (وهي موجودة في العديد من اللغات) ، ولكن ممارسة استخدامه محدودة للغاية ، وربما يرجع ذلك إلى الافتقار إلى وصف الأمثلة في مختلف "أفضل الممارسات" ومجموعات القوالب والمصادر المشابهة. وهو أمر غريب ، في رأيي ، أنه يوجد تركيز على إخفاء الطرق والخصائص الداخلية للكائنات ، ولكن لا أحد يكاد يهتم بحقيقة أن القطع المنطقية الأكبر من التعليمات البرمجية في شكل فئات مكتبة فائدة أو مجالات مجال تظل في مساحة الرؤية العالمية.