Intereting Posts
Круговая диаграмма с разным процентом заполнения Почему я не могу получить доступ к дате DateTime-> в классе DateTime PHP? Это ошибка? Как заливать кадр с помощью изображения шаблона с использованием класса php imagick? Выберите nodeValue, но исключаем дочерние элементы. PHP. Есть ли переносимая версия PHPUnit? Включить PCNTL в Ubuntu PHP – тест не работает Новый MYSQL-сервер не знает JSON-тип данных Вложение файлов с помощью PHPMailer Загрузка файла в IE6 получает неправильное имя файла Проблема с Imagick, а также с phmagick: делегат Postscript не удалось / Нет такого файла или каталога PHP: использование exit (); или умереть(); после заголовка («Местоположение:»); Вставить значение динамического значения выбора в базу данных Mysql и показать отправленное сообщение Максимальный размер значения в массиве PHP Узнайте HTTP-метод в PHP Изменение относительных URL-адресов файлов Javascript

Autoload php-классы из подпапок с использованием символа подчеркивания (стиль PEAR)

Я немного новичок в объектно-ориентированном PHP и MVC, поэтому мне действительно нужна помощь.

У меня есть структура папок стиля MVC с подпапками в файловой системе
– например, view/classes/subfolder/classname.php

Я использую mod_rewrite для дружественных для человека URL-адресов, таких как /classname или /foldername/calssname , которые затем передаются загрузчику страниц в качестве разделительных значений подчеркивания.
– например, foldername_classname

 // Файл загрузчика страницы
 require_once ($ _ SERVER [ 'DOCUMENT_ROOT'] '/ местные / classLoader.php.);
 session_start ();
 $ page = new $ _REQUEST ['page'];

Я ранее использовал блок [if / else if / else] для тестирования в каждой возможной папке, но это кажется неэффективным, поэтому я ищу лучший способ поиска автозагрузчика во многих разных местах.

Вот мой последний сбой, который не удается найти ни одного из запрошенных классов и просто выводит исключение для каждого, заканчивая фатальной ошибкой !:

 function classToPath ($ class) {
     $ path = str_replace ('_', '/', $ class).  '.php';
     return $ path;
 }

 function autoloadController ($ class) {
     echo 'LoadController'. ' 
«; $ root = '/ controller / classes /'; $ pathtoclass = $ root.classToPath ($ class); пытаться { if (file_exists ($ pathtoclass)) require_once ($ pathtoclass); else throw new Exception («Невозможно загрузить контроллер». $ class); } catch (Исключение $ e) { echo 'Исключение контроллера:'. $ e-> getMessage (). "
«; } } функция autoloadModel ($ class) { echo 'LoadModel'. '
«; $ root = '/ model / classes /'; $ pathtoclass = $ root.classToPath ($ class); пытаться { if (file_exists ($ pathtoclass)) require_once ($ pathtoclass); else throw new Exception («Нельзя загрузить модель». $ class); } catch (Исключение $ e) { echo 'Исключение модели:'. $ e-> getMessage (). "
«; } } функция autoloadView ($ class) { echo 'LoadView'. '
«; $ root = '/ view / classes /'; $ pathtoclass = $ root.classToPath ($ class); пытаться { if (file_exists ($ pathtoclass)) require_once ($ pathtoclass); else throw new Exception («Невозможно загрузить представление». $ class); } catch (Исключение $ e) { echo 'Просмотр исключения:'. $ e-> getMessage (). "
«; } } spl_autoload_register ( 'autoloadController'); spl_autoload_register ( 'autoloadModel'); spl_autoload_register ( 'autoloadView');


Мне также было интересно узнать, как должен работать URL-адрес для сопоставления папки / класса:
– т.е. URL: /foldername/classname mod_rewritten в foldername_classname ;
с именем файла classname.php в папке foldername ;
и определение class foldername_classname extends another_class { etc. php класса class foldername_classname extends another_class { etc.

Это правильный метод?

Related of "Autoload php-классы из подпапок с использованием символа подчеркивания (стиль PEAR)"

Скорее случайно, относясь к другому вопросу , я нашел решение своей проблемы !

Поэтому, чтобы ответить на мои собственные вопросы (и, надеюсь, помочь другим):

  • имя файла должно быть только последней частью URL-адреса
    т.е. .../not-this-part/but-this
  • структура папок должна быть картой структуры URL
    например .../folder/subfolder/class
  • и класс должен быть определен как полный путь, но с символами подчеркивания вместо прямой косой черты
    например, class folder_subfolder_class {

Затем я написал функцию для каждой системы классов (model, view & controller) и использовал spl_autoload_register() для регистрации каждой функции как функции __autoload . Таким образом, …

 function loadController ($ class) {
     $ path = $ _SERVER ['DOCUMENT_ROOT']. '/ application / controller /';
     $ filename = str_replace ('_', DIRECTORY_SEPARATOR, strtolower ($ class)). '. php';

     if (file_exists ($ path. $ filename)) {
         require_once ($ путь $ имя_файла.);
     }
 }
 etc..etc ..
 spl_autoload_register ( 'loadController');
 ...

Для тех, кто интересуется частью mod_rewrite

 IfModule mod_rewrite.c
     RewriteEngine On

     RewriteBase /

     RewriteCond% {SCRIPT_FILENAME}! -f
     RewriteCond% {SCRIPT_FILENAME}! -d

     RewriteRule ^ ([az] +) / ([az] +) /? $ /? Page = $ 1_ $ 2 [QSA, NC, L]
     RewriteRule ^ ([az] +) /? $ /? Page = $ 1 [QSA, NC, L]
 / IfModule