سؤال

spl_autoload_register هل يمكنني القيام بهذا النوع من العمل ، لكنني لا أفهم كيف يتم هذا النوع من الوظائف؟

spl_autoload_register(array('Doctrine', 'autoload'));
هل كانت مفيدة؟

المحلول

الفكرة الأساسية هي أنه ليس عليك الكتابة include/require التعليمات بعد الآن: كلما حاولت استخدام فئة غير محددة ، ستتصل PHP بـ Autoloader.

وظيفة التحميل التلقائي ، إذن ، هي تحديد الملف الذي يجب تحميله ، و include هذا ، لذلك يصبح الفصل محدد.

يمكن لـ PHP استخدام هذا الفصل ، كما لو كنت الشخص الذي كتب include التعليمات ، التي تم تنفيذها في الواقع في وظيفة التحميل التلقائي.


"الخدعة" هي أن وظيفة التحميل التلقائي:

  • يستقبل فقط اسم الفصل
  • يجب أن تحدد الملف الذي سيتم تحميله - أي الملف الذي يحتوي على تلك الفئة.

هذا هو السبب في تسمية الاتفاقية ، مثل Pear One ، التي تقول هذه الفئة مثل Project_SubProject_Component_Name يتم تعيينها إلى ملفات مثل Project/SubProject/Component/Name.php -- بمعنى آخر '_'في أسماء الفصول ، يتم استبدالها بواسطة مائلة (الدلائل ، الدلائل الفرعية) على نظام الملفات.


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

$class = self::getPath() 
            . DIRECTORY_SEPARATOR . 
            str_replace('_', DIRECTORY_SEPARATOR, $className) 
            . '.php';
if (file_exists($class)) {
    require $class;
    return true;
}
return false;

مما يعني أن اسم الفصل هو تعيين نظام الملفات ، واستبداله "_' بواسطة '/'، وإضافة نهائي .php إلى اسم الملف.

على سبيل المثال ، إذا كنت تحاول استخدام Doctrine_Query_Filter_Chain الفصل ، وهو غير معروف من قبل PHP ، Doctrine_Core::autoload سيتم استدعاء الوظيفة ؛ سيحدد أن الملف الذي يجب تحميله هو Doctrine/Query/Filter/Chain.php ؛ ومع وجود هذا الملف ، سيتم تضمينه - مما يعني أن PHP الآن "يعرف" Doctrine_Query_Filter_Chain صف دراسي.

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