#php
#php
Вопрос:
Краткая информация о моем вопросе:
Я собираюсь начать новый проект, который будет иметь различные функциональные возможности. Мне нужно организовать функции на основе модулей. Например, функции, связанные с членами, переходят в класс членов member.php
, а функция, связанная с галереей, переходит в класс галереи gallery.php
. И эти файлы будут в папке root/modules/
. В этой папке будет много файлов, представляющих каждый модуль.
Я буду использовать htaccess
для перенаправления любого запрошенного на index.php
, и этот файл сделает все, что необходимо для отображения страницы.
Итак, основываясь на вышеизложенном (перенаправление и использование одного файла для обработки всех запросов) Я буду использовать include
функцию PHP для включения всех модулей.
Я не уверен, что включение всех модулей вызовет какие-либо проблемы.
Нужен совет по:
- Вызовет ли включение всех модулей какие-либо проблемы, связанные со скоростью и т. Д
- Есть ли какие-либо рекомендации / альтернативы для включения модулей
Комментарии:
1. Включайте только те файлы, которые вам действительно нужны, и переносите весь код в объекты — проверьте эту функцию :
spl_autoload_register()
. Я также могу предложить создать папку для каждого модуля (как в Zend Framework), потому что вы можете разместить более 1 файла на «модуль»:root/modules/Gallery/...
2. Я бы посоветовал вам написать один php для каждого файла, и он
index.php
просто перенаправляет на правильный. Таким образом, вам нужно загружать только те модули, которые вам действительно нужны (в специализированных php)3. Я предлагаю вам продолжить и изучить модульную структуру для этого, зачем заново изобретать колесо, когда вы явно понятия не имеете, что делаете. Извините за резкую критику.
4. @RaggaMuffin-420 Что, если я пытаюсь создать простую структуру, уставшую от громоздких других? Поэтому мне, очевидно, нужно найти лучшее колесо
5. @Lepanto Ну, хороший фреймворк будет загружать только то, что вам нужно, несмотря на то, что он занимает много места, над ним будут усердно работать, чтобы оптимизировать память и производительность, я не вижу, чтобы ваше «колесо» было лучше, если вы задаете такой вопрос, чтобы быть честным товарищем.
Ответ №1:
Использование SPL-автозагрузчика
Существует spl_autoload_register()
функция, которая позволяет вам указать пользовательскую функцию автозагрузки. Начиная с PHP 5.3.0, вы даже можете указать замыкание.
Самое интересное в использовании автозагрузчика заключается в том, что он будет загружать запрошенные файлы по требованию, поэтому у вас не будет накладных расходов, включая все файлы по вашему запросу.
Это означает, что вместо выдачи ошибки, когда экземпляр класса не может быть создан, поскольку он не был найден, он запустит вашу функцию автозагрузки и передаст запрошенный класс. Затем ваш автозагрузчик, конечно, должен загрузить соответствующий файл.
Пример
/autoloadsample.php
<?php
spl_autoload_register(function($class){
include 'classes/' . $class . '.php';
});
$user = new User();
$user->test();
/classes/User.php
<?php
class User {
public function test()
{
echo "Hello World";
}
}
Как вы можете видеть, мы не включили /classes/User.php файл вручную. Тем не менее, здесь все будет работать.
Использование Composer
Хотя SPL-автозагрузчик будет работать для небольших проектов, это не обязательно лучшее решение. Если у вас сложная структура проекта, вам нужно будет самостоятельно позаботиться о том, где файлы, которые вы хотите загрузить, расположены по всему вашему проекту.
К счастью, у нас есть Composer. Это аккуратный PHP-менеджер пакетов / зависимостей, который также предоставляет вам автозагрузчик.
После установки composer довольно легко запустить автозагрузку.
Создайте composer.json
в корне ваших проектов.
{
"autoload": {
"classmap": [
"ProjectDomain"
]
}
}
Это просто обычный старый файл json. Массив classmap принимает строки каталогов, которые вы хотите загрузить автоматически.
Затем используйте командную строку для переключения в рабочий каталог проектов и
composer install
или composer.phar install
(если вы не установили composer глобально)
Composer создаст vendor/
для вас каталог, который обычно содержит требуемые вами зависимости из вашего composer.json
, но поскольку они нам не нужны, мы просто пропустим это.
В этом каталоге вы найдете autoload.php
файл, который теперь вы можете просто запросить у своего фронт-контроллера.
index.php
<?php
include 'vendor/autoload.php';
$user = new User();
$user->test();
Composer также поддерживает автозагрузку PSR-X. Так что вы можете использовать классы с пространством имен, а composer будет обрабатывать всю автозагрузку. Это может, например, выглядеть так.
composer.json
{
"autoload": {
"psr-4": {
"Project\": "ProjectDomain"
}
}
}
ProjectDomain/User.php
<?php namespace Project;
class User {
public function test()
{
echo "Hello World!";
}
}
index.php
<?php
include 'vendor/autoload.php';
$user = new ProjectUser();
$user->test();
Обязательно запускайте composer dump-autoload
его всякий раз, когда вносите изменения, связанные с автозагрузкой, в свой файл composer.json.