سؤال

مثل معظم مطوري الويب هذه الأيام، أستمتع تماما بفوائد بنية MVC الصلبة لتطبيقات الويب والمواقع. عند القيام MVC مع PHP، يأتي Autoloading من الواضح بجدية مفيدة للغاية.

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

على سبيل المثال، دعنا نقول أن لدي تطبيق يحتوي على مسار أساسي يعرف باسم PATH_APP, وبنية بسيطة مع الدلائل المسماة models, views و controllers. وبعد غالبا ما استخدم هيكل تسمية حيث يتم تسمية الملفات IndexView.php و IndexController.php داخل الدليل المناسب، والنماذج عموما ليس لديهم مخطط معين بشكل افتراضي. قد يكون لدي وظيفة لودر لهذا الهيكل مثل هذا الذي يتم تسجيله spl_autoload_register:

public function MVCLoader($class)
{
    if (file_exists(PATH_APP.'/models/'.$class.'.php')) {
        require_once(PATH_APP.'/models/'.$class.'.php');
        return true;
    }
    else if (strpos($class,'View') !== false) {
        if (file_exists(PATH_APP.'/views/'.$class.'.php')) {
            require_once(PATH_APP.'/views/'.$class.'.php');
            return true;
        }
    }
    else if (strpos($class,'Controller') !== false) {
        if (file_exists(PATH_APP.'/controllers/'.$class.'.php')) {
            require_once(PATH_APP.'/controllers/'.$class.'.php');
            return true;
        }
    }
    return false;
}

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

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

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

المحلول

هذا هو ما كنت أستخدمه في جميع مشاريعي (رفع مباشرة من مصدر آخر واحد):

public static function loadClass($class)
{
    $files = array(
        $class . '.php',
        str_replace('_', '/', $class) . '.php',
    );
    foreach (explode(PATH_SEPARATOR, ini_get('include_path')) as $base_path)
    {
        foreach ($files as $file)
        {
            $path = "$base_path/$file";
            if (file_exists($path) && is_readable($path))
            {
                include_once $path;
                return;
            }
        }
    }
}

إذا كنت أبحث عن someclass_seperatedwith_underscores، فسوف تبحث عن someclass_seperatedwith_underscores.php تليها Someclass / seperatedwith / underscores.php الجذور في كل دليل في المسار الموجز الحالي.

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

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

نصائح أخرى

هبطت في هذا الحل:

لقد قمت بإنشاء برنامج نصي واحد يقوم بعمل مجلد مكتبة الفئة (والذي يحتوي على مجلدات فرعية لنظم / أنظمة منفصلة)، ويوزع محتويات الملفات بحثا عن تعريفات فئة. إذا وجد تعريف فئة في ملف PHP (نمط Regex بسيط جدا)، فإنه يخلق Symlink:

class_name.php -> actual/source/file.php

يتيح لي أن استخدام وظيفة توليفات واحدة واحدة، بسيطة تحتاج فقط إلى اسم الفصل والمسار إلى مجلد Symlink الرئيسي، ولا يلزم القيام بأي معالجة مسارات / سلسلة.

أفضل جزء هو أنه يمكنني إعادة ترتيب شفرة المصدر الخاصة بي تماما أو إضافة نظام فرعي جديد وتشغيل البرنامج النصي الذي تم توليد الارتباط للحصول على كل شيء محمول بالتوتول.

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

include_once $this->views_path . $class . '.php';

إذا كنت بحاجة إلى مسارات متعددة "عرض"، فقم بإجراء وظيفة يتم تحميل المشاهدات:

public function load_view($class) {
    // perhaps there's a mapping here instead....
    foreach ($this->views_paths as $path) {
        $filename = $path . $class . '.php';
        if (file_exists($filename)) {
            include_once $filename;
        }
    }
    throw ....
}

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

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