سؤال

في بلدي يلي_Path على جانب الخادم لدي مرجع إلى دليل الكمثرى، في "/ USR / المشاركة / الكمثرى /". ضمن تطبيقاتي، أدرج الملفات من مكتبة مشتركة، تعيش في "/ USR / المشاركة / الكمثرى / المكتبة /" مع require_once 'library/file.php'.

لقد بدأت مؤخرا في استخدام SPL AutoLoader، لقد لاحظت في وظيفة Loader التي يجب عليك تحديد المنطق الذي تضمين الملف. كانت الطريقة الأولى للقيام بذلك تحاول تضمين ملف وقمعها @ لمعرفة ما إذا كان سيفشل، على سبيل المثال @include 'library/file.php' ومع ذلك أفكر في الغالب لأنني قرأت الكثير @ كونك ممارسة سيئة قررت أن أقوم به يدويا بنفسي عن طريق تنفجر get_include_path بواسطة PATH_SEPARATOR ورؤية ما إذا كان الدليل هو ما أريده، ثم القيام بذلك file_exists و بما في ذلك.

مثل ذلك:

function classLoader( $class ) {
    $paths = explode( PATH_SEPARATOR, get_include_path() );
    $file = SITE_PATH . 'classes' . DS . $class . '.Class.php';
    if ( file_exists( $file) == false ) 
    {
        $exists = false;
        foreach ( $paths as $path ) 
        {
            $tmp = $path . DS . 'library' . DS . 'classes' . DS . $class . '.Class.php';
            if ( file_exists ( $tmp ) ) 
            {
            $exists = true;
            $file = $tmp;
            }
        }
        if ( !$exists ) { return false; }
    }
    include $file;
}

spl_autoload_register('classLoader');

هل ذهبت الطريق الخطأ؟ يجب أن فعلت للتو @include العمل أو هل أفعل ذلك إلى حد ما في الاتجاه الصحيح؟

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

المحلول

شيء واحد Habari Project Autoloader. هل هذا مثير للاهتمام هو ذاكرة التخزين المؤقت قائمة ملف الفئة بأكملها في الذاكرة بحيث لا تقوم بعمل عمليات البحث للقرص للملفات في كل مرة يتم فيها طلب الفصل.

أساسا، أنت تعلن ثابتا داخل __autoload() الذي يحمل مجموعة من جميع الملفات الفئة، مفهرسة من الفئة التي ستتسبب في تحميلها. على سبيل المثال، سيستخدم الرمز Dir أو glob() لتوليد هذه الصفيفات الثابتة:

$class_files = array(
  'user' => '/var/www/htdocs/system/classes/user.class.php',
);

ثم عليك ببساطة $class_files[$class] للحصول على الملف الصحيح. هذا لطيف وسريع لأنه يحصل على الكتالوج من القرص مرة واحدة، بدلا من إنشاء القائمة أو البحث عن اسم ملف معين في كل مرة يتم الرجوع إليها فئة جديدة. (سوف تفاجأ كم فرق السرعة التي يصنعها.)

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

include_once() هو أن تجنب، و @ المشغل غير ضروري إذا قمت بتحقق من الملف لتضمينه.

نصائح أخرى

أنا شخصيا أذهب إلى الطريق باستخدام

function autoload($class) {
    /* transform class name into filename ... */
    include $class;
}

حتى بدون تصحيح الأخطاء في @ (أخطاء إيقاف تشغيل / تسجيل الدخول)

قد تكون مهتما أيضا بالمناقشة ذات الصلة على قائمة Developer PHP: http://marc.info/؟t=125787162200003&r=1&w=2.

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