За последние 24 часа нас посетили 34675 программистов и 1313 роботов. Сейчас ищут 927 программистов ...

Правила автозагрузки spl_autoload_register

Тема в разделе "PHP для новичков", создана пользователем AlexProg, 12 дек 2017.

  1. AlexProg

    AlexProg Активный пользователь

    С нами с:
    13 май 2014
    Сообщения:
    320
    Симпатии:
    7
    Всем привет!

    Не нашел информации в интернете задам здесь.

    Есть код:


    PHP:
    1. function autoloadModel($className) {
    2. $filename = "models/" . $className . ".php";
    3. if (is_readable($filename)) {
    4. require $filename;
    5. }
    6. }
    7. function autoloadController($className) {
    8. $filename = "controllers/" . $className . ".php";
    9. if (is_readable($filename)) {
    10. require $filename;
    11. }
    12. }
    13. spl_autoload_register("autoloadModel");
    14. spl_autoload_register("autoloadController");
    Вопрос: На сколько корректный данный код? Можно ли по правилам (PSR-0, PSR-4 и т.д.) использовать такую автозагрузку?

    Спасибо!
     
  2. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.815
    Симпатии:
    1.332
    Адрес:
    Лень
  3. AlexProg

    AlexProg Активный пользователь

    С нами с:
    13 май 2014
    Сообщения:
    320
    Симпатии:
    7
    А если без наймспейсов и подгружаем с трех разных папок (core, classes, models) ?
     
  4. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.815
    Симпатии:
    1.332
    Адрес:
    Лень
    это признак домашнего говнокодинга
     
  5. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.815
    Симпатии:
    1.332
    Адрес:
    Лень
    есть второй способ , реестром.
    PHP:
    1. <?php
    2.  
    3. final class Aero
    4. {
    5.     protected static $maps = [
    6.         'Karma'            => 'core\Karma',
    7.         'Component'        => 'classes\Component',
    8.         'House'            => 'model\House',
    9.     ];
    10.    
    11.     public function autoload( string $name )
    12.     {
    13.         include strtr ( self::$maps[$name] ?? $name, [ '\\' => DIRECTORY_SEPARATOR ] ) . '.php';
    14.     }
    15. }
    16.  
    17. spl_autoload_register ( [ Aero::class, 'autoload' ] );
     
  6. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.598
    Симпатии:
    1.764
    @webog, PSR-0 и PSR-4 придуманы для того, чтобы организовать много пространств имён, и чтоб можно было найти любой класс, подставив вместо пространств имён папки, а вместо имени класса - имя файла. То,что ты написал, к PSR никакого отношения не имеет.
    --- Добавлено ---
    Но PSR - это не правила, это набор рекомендаций, которым можно и не следовать.
     
    Deonis и Maputo нравится это.
  7. AlexProg

    AlexProg Активный пользователь

    С нами с:
    13 май 2014
    Сообщения:
    320
    Симпатии:
    7
    Почему? В MVC минимум три папки от куда подгружаем класс(контроллер, модель)
     
  8. Deonis

    Deonis Старожил

    С нами с:
    15 фев 2013
    Сообщения:
    1.521
    Симпатии:
    504
    Я думаю, что @MouseZver отреагировал на другое:
     
    AlexProg нравится это.
  9. AlexProg

    AlexProg Активный пользователь

    С нами с:
    13 май 2014
    Сообщения:
    320
    Симпатии:
    7
    Относится к этой теме, задам тут вопрос:

    Что бы загрузилась страница, нужно выполнить ф-ю loadPage и в нее передать $twig. Все работает! работало до того момента как добавились @бучи@ наймспейсы.
    Работало вот так:
    PHP:
    1. $cn = $this->controllerName.'_Controller';
    2.  
    3. $controller = new $cn;
    4.         $action = $this->actionName.'Action';
    5.  
    6.         if(method_exists($controller, $action))
    7.         {
    8.             $controller->$action($twig);
    9.         }
    Все, метод (ф-я) запущена, страница загружена. НО! С namespace нужно запускать вот так:

    PHP:
    1. $controller = new application\controllers\News_Controller();
    НО! Так будут только новости везде.
    Вопрос: Как сделать автоматическое подставление вызваного контроллера?

    Так не получилось:


    PHP:
    1. $cn = $this->controllerName.'_Controller';
    2. $ass = 'application\controllers';
    3. $controller = new $ass.'\\'.$cn;
    Может есть способ иначе вызвать indexAction в файле контроллера который сейчас подключен/загружен/вызван?
     
  10. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Без неймспейсов ты либо будешь дописывать "неймспейс" в имя класса, чтобы он ни с чем не пересекался, либо словишь гарблей.

    Вариант с дописыванием имени тоже работает, в общем-то. И до изобретения неймспейсов был прям манной небесной. Но неймспейсы гибче.
     
  11. AlexProg

    AlexProg Активный пользователь

    С нами с:
    13 май 2014
    Сообщения:
    320
    Симпатии:
    7
    Кто еще желает высказаться, только по моему вопросу пожалуйста!?
     
  12. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Оке, использовать такое решение можно. Но можно сделать лучше. Больше и говорить нечего, собсна.
     
    Maputo и AlexProg нравится это.
  13. AlexProg

    AlexProg Активный пользователь

    С нами с:
    13 май 2014
    Сообщения:
    320
    Симпатии:
    7
    Как? Можно пример?
     
  14. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    С неймспейсами.
     
  15. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.598
    Симпатии:
    1.764
    @webog, раз уже ты сам заговорил о PSR-ах, почему бы тебе их не использовать? И любой PSR-совместимый автозагрузчик. И composer взять хотя бы просто для автозагрузки - там можно очень гибко настраивать его стандартный автозагрузчик
     
  16. AlexProg

    AlexProg Активный пользователь

    С нами с:
    13 май 2014
    Сообщения:
    320
    Симпатии:
    7
    Все это хорошо, но наймспейсы пройдены и сделаны.
    Речь шла о создании объекта и вызова его метода автоматически. Зависит от выбранного (что в браузере открыто) контроллера.