سؤال

ما الحل هل توصي بما في ذلك الملفات في PHP المشروع ؟

  1. لا يوجد دليل المكالمات تتطلب/تشمل وظائف - كل شيء الأحمال خلال autoload وظائف
  2. حزمة استيراد عند الحاجة.

هنا هو حزمة استيراد API:

import('util.html.HTMLParser');
import('template.arras.*'); 

في هذه الوظيفة إعلان يمكنك تنفجر السلسلة مع النقاط (حزمة الهرمي delimeter), حلقات خلال الملفات في حزمة معينة (مجلد) لتشمل واحد منهم أو كل منهم إذا كان رمز العلامة النجمية في نهاية السلسلة ، على سبيل المثال('القالب.أراس.*').

واحدة من الفوائد أستطيع أن أرى في حزمة استيراد الأسلوب هو أنه يمكن أن تجبرك على استخدام أفضل وجوه التحلل الدرجة التجمع.

واحدة من عيوب أستطيع أن أرى في autoload الطريقة - هو أن autoload وظيفة يمكن أن تصبح كبيرة جدا وليس من الواضح جدا/للقراءة.

ما رأيك في ذلك ؟

  • ما مزايا/عيوب يمكن لك اسم في كل من هذه الأساليب ؟
  • كيف يمكنني العثور على أفضل حل لهذا المشروع ؟
  • كيف يمكنني أن أعرف إذا كان سيكون هناك أي مشاكل في الأداء إذا كان حزمة إدارة المستخدم ؟
هل كانت مفيدة؟

المحلول

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

  • تسمية الفئة المتسقة:كل فئة في ملف خاص بها، ويتم تسمية كل فئة بحالة الجمل مفصولة بشرطة سفلية.هذا يعين مسار الفصل.على سبيل المثال، يقوم Some_CoolClass بتعيين دليل الفصل الخاص بنا ثم "Some/CoolClass.class.php".أعتقد أن بعض الأطر تستخدم هذه الاتفاقية.
  • تتطلب صراحة فئات خارجية:نظرًا لأنه لا يمكننا التحكم في تسمية أي مكتبات خارجية نستخدمها، فإننا نقوم بتحميلها باستخدام وظيفة PHP التي تتطلب_once().

نصائح أخرى

استيراد الأسلوب هو تحسن ولكن لا تزال كميات أكثر من الحاجة.
إما عن طريق استخدام العلامة النجمية أو تحميلها في بداية البرنامج النصي (لأن المستوردة من قبل كل "جديد Classname" سوف تصبح مرهقة)

أنا من محبي __autoload() أو حتى أفضل spl_autoload_register()
لأنه سوف تشمل فقط دروس كنت تستخدم اضافية تستفيد من لا يبالي أين الطبقة يقع.إذا كان الخاص بك الكليات ينتقل الملف إلى دليل آخر أنت لا تنفذ.

الجانب السلبي هو أنه بحاجة إلى مزيد من المنطق لجعلها تعمل بشكل صحيح مع الدلائل.

أستخدم require_once("../path-to-auto-load-script.php.inc") مع التحميل التلقائي

لدي اصطلاح تسمية قياسي لجميع الفئات وملفات inc مما يسهل تحديد اسم الفئة المطلوب حاليًا برمجيًا.

على سبيل المثال، جميع الفئات لها امتداد معين مثل inc.php
(لذلك أعلم أنهم سيكونون في الدليل /cls)
و
تبدأ جميع ملفات inc بـ .ht (لذا ستكون موجودة في الدليل /inc)

يقبل التحميل التلقائي معلمة واحدة:className، والذي أستخدمه بعد ذلك لتحديد مكان وجود الملف بالفعل.التكرار بمجرد أن أعرف ما هو الدليل المستهدف الخاص بي، في كل مرة أقوم بإضافة "../" لحساب الصفحات الفرعية الفرعية، (والتي يبدو أنها تكسر التحميل التلقائي بالنسبة لي) وأخيرًا تتطلب العثور على ملف التعليمات البرمجية الفعلي بمجرد العثور عليه.

أقترح بشدة القيام بما يلي بدلاً من ذلك:

قم برمي جميع فئاتك في مصفوفة ثابتة، className => filepath/classFile.يمكن لوظيفة التحميل التلقائي استخدام ذلك لتحميل الفئات.

وهذا يضمن أنك تقوم دائمًا بتحميل الحد الأدنى من الملفات.وهذا يعني أيضًا أنك تتجنب أسماء الفئات السخيفة تمامًا، وتحليل الأسماء المذكورة.

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

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

أنا لست من محبي __autoload().في الكثير من المكتبات (بعض مكتبات PEAR، على سبيل المثال)، يستخدم المطورون class_exists() دون المرور في المعلمة الثانية الجديدة نسبيا.من الممكن أيضًا أن يواجه أي رمز قديم لديك هذه المشكلة.يمكن أن يسبب هذا تحذيرات وأخطاء إذا كان لديك __autoload() مُعرف.

إذا كانت مكتباتك واضحة، ولم يكن لديك تعليمات برمجية قديمة للتعامل معها، فهي أداة رائعة.أتمنى أحيانًا أن تكون PHP أكثر ذكاءً فيما يتعلق بكيفية إدارتها لسلوك class_exists(), ، لأنني أعتقد أن المشكلة تكمن في تلك الوظيفة وليس في تلك الوظيفة __autoload().

من المحتمل أن يكون تدوير نظام التغليف الخاص بك فكرة سيئة.أود أن أقترح عليك استخدام تضمينات يدوية صريحة، أو مع التحميل التلقائي (أو مجموعة لهذه المسألة).

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