За последние 24 часа нас посетили 201563 программиста и 2096 роботов. Сейчас ищут 1754 программиста ...

Автоматическая загрузка классов ядра

Тема в разделе "PHP для новичков", создана пользователем Guliver, 27 фев 2015.

  1. Guliver

    Guliver Новичок

    С нами с:
    26 июн 2013
    Сообщения:
    72
    Симпатии:
    0
    Добрый вечер! Хочу сделать автоподгрузку классов ядра сайта. Подскажите как правильно реализовать это? Сейчас у меня подгрузка осуществляется так:
    Файл Index.php:
    Код (Text):
    1. /*
    2.  *---------------------------------------------------------------
    3.  * ВХОДНОЙ СКРИПТ
    4.  *---------------------------------------------------------------
    5.  */
    6.  
    7.     require_once(APP_PATH.'/myapp.php');    //подключаем файл приложения
    8.     MyApplication::run();                   //запускаем ядро приложения

    Файл myapp.php:

    Код (Text):
    1. <?php
    2.  
    3. //приложение
    4. class MyApplication {
    5.  
    6.    
    7.    
    8.    
    9.     //запуск нового приложения
    10.     public static function run() {
    11.         require_once(APP_PATH.'/core/session.php');         //подключаем файл, содержащий класс для работы с сессиями
    12.         require_once(APP_PATH.'/config/config.php');        //подключаем файл, содержащий класс конфигурации приложения
    13.         require_once(APP_PATH.'/core/loadhelper.php');      //подключаем файл, содержащий класс загрузки классов помощников
    14.         require_once(APP_PATH.'/core/loadfilter.php');      //подключаем файл, содержащий класс загрузки классов фильтров
    15.         require_once(APP_PATH.'/core/controller.php');      //подключаем файл, содержащий класс Controller
    16.         require_once(APP_PATH.'/core/model.php');           //подключаем файл, содержащий класс модели
    17.         require_once(APP_PATH.'/core/view.php');            //подключаем файл, содержащий класс View - представление
    18.         require_once(APP_PATH.'/core/db.php');              //подключаем файл, содержащий класс для подключения к БД
    19.         require_once(APP_PATH.'/core/mysql.php');           //подключаем файл, содержащий класс для работы с СУБД MySQL
    20.         require_once(APP_PATH.'/core/mongo.php');           //подключаем файл, содержащий класс для работы с MongoDb
    21.         require_once(APP_PATH.'/core/security.php');        //подключаем файл, содержащий методы, которые помогают создавать безопасные приложения, обрабатывая данные для безопасности
    22.         require_once(APP_PATH.'/core/bauth.php');           //подключаем файл, содержащий базовый класс аутентификации
    23.         require_once(APP_PATH.'/core/icache.php');          //подключаем файл, содержащий интерфейс для классов работающих с кешированием
    24.         require_once(APP_PATH.'/core/mcache.php');          //подключаем файл, содержащий синглтон класс для работы с Memcache
    25.         require_once(APP_PATH.'/core/fcache.php');          //подключаем файл, содержащий синглтон класс, реализующий механизм кеширования на файлах
    26.         require_once(APP_PATH.'/components/user.php');      //подключаем файл, содержащий класс пользователя
    27.         require_once(APP_PATH.'/components/auth.php');      //подключаем файл, содержащий класс аутентификации
    28.         require_once(APP_PATH.'/core/request.php');         //подключаем файл, содержащий класс обработки запросов
    29.         require_once(APP_PATH.'/core/route.php');           //подключаем файл, содержащий класс для роутинга
    30.     }
    31.  
    32. }
     
  2. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    1. подключаемый файл класса должен иметь только описание класса, никакого потокового алгоритма
    2. не надо подключать всё сразу. подключать нужно только то что будет использовано.
    3. чтоб проще было реализовать пункт 2 - изучай автозагрузку. тогда при вызове класса машина заметит его отсутствие, попробует выполнить автозагрузку и если всё ок - класс прозрачно появится в памяти и будет использован. если что-то пойдет не так - будет просто фатал об использовании недекларированного класса.
     
  3. Guliver

    Guliver Новичок

    С нами с:
    26 июн 2013
    Сообщения:
    72
    Симпатии:
    0
    Такой вариант верен?
    Файл index.php:
    Код (Text):
    1. require_once(APP_PATH.'/myapp.php');    //подключаем файл приложения
    2.     MyApplication::__autoload ($className);    //запускаем ядро приложения
    3.     class_exists('Session');
    4.     class_exists('Config');
    5.     class_exists('LoadHelper');
    6.     class_exists('LoadFilter');
    файл myap.php:

    Код (Text):
    1.  
    2. //приложение
    3. class MyApplication {
    4.  
    5.    
    6.     public static function __autoload ($className) {
    7.         /** AutoLoad config */
    8.         if(file_exists(APP_PATH."/config/".$className.".php")){
    9.             $result = require_once ""APP_PATH."/config/".$className.".php";
    10.             return $result;
    11.         /** AutoLoad core */
    12.         } elseif(file_exists(APP_PATH."/core/".$className.".php")){
    13.             $result = require_once ""APP_PATH."/core/".$className.".php";
    14.             return $result;
    15.         /** AutoLoad components */
    16.         } elseif(file_exists(APP_PATH."/components/".$className.".php")) {
    17.             $result = require_once ""APP_PATH."/components/".$className.".php";
    18.             return $result;
    19.         } else {
    20.             exit("Имя файла не соответствует названии Класса");
    21.         }
    22.     }
     
  4. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    типа того, но тебе явно не хватает пространства имён.
    плюс имхо класс должен искаться в двух локациях или одной:
    * в двух локациях для исходника или теста
    * в одной локации если задан ремап пути
    причем искаться с учетом пространства имен. см PSR-4 например
     
  5. Guliver

    Guliver Новичок

    С нами с:
    26 июн 2013
    Сообщения:
    72
    Симпатии:
    0
    Спасибо. Посмотрю сейчас.