فصول خاصة. يختبئ في فب

في 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
 /** * The private class */ final class PrivateClass { /** * defines the only class able to instantiate the current one * * @var string */ private $allowedConsumer = 'AllowedPrivateClassConsumer'; /** * constructor * * @throws Exception */ public function __construct() { /** * here comes the privacy filter, it could be extracted to a private method * or to a static method of another class with few adjustments */ $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/ ).


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

Source: https://habr.com/ru/post/ar435894/


All Articles