2016-02-17 5 views
1

Я пытаюсь начать использовать автозагрузчик SPL, но пока не могу понять его важность.В чем разница между включенными файлами и использованием автозагрузчика SPL.

Допустим, у меня есть каталог «классы» с подкаталогами и файлами php в них как классы следующим образом.

'classes/feed/feed.php'; 
'classes/compose/file_upload.php'; 
'classes/compose/char_limit.php'; 
'classes/feed/postrank/postrank.php'; 
'classes/notifications/push.php'; 

Затем я создаю PHP файл с именем autoloader.php внутри директории «классы» с включает в себя следующие

<?php 

    include_once 'feed/feed.php'; 
    include_once 'compose/file_upload.php'; 
    include_once 'compose/char_limit.php'; 
    include_once 'feed/postrank/postrank.php'; 
    include_once 'notifications/push.php'; 

    ?> 

Тогда на каждой странице, где я хочу, чтобы эти классы я просто включить файл autoloader.php включить все классы проекта.

1. С какими проблемами я сталкиваюсь, поскольку проект растет?

2. Если бы я начал использовать автозагрузчик SPL, как бы установить его с моей текущей структурой каталогов?

3. Есть ли разница в времени загрузки между использованием include/require по сравнению с автозагрузкой SPL?

4. Должны ли все классы находиться под одним каталогом «классы?»? или нет проблем с моей файловой структурой?

+0

Это похоже на концепцию динамической библиотеки ссылок. Что-то, чтобы включить файлы в случае необходимости, а не включать все сразу. – frz3993

ответ

1

1. С какими проблемами я сталкиваюсь, поскольку проект растет?

Вам нужно будет добавить все больше и больше файлов в ваш autoloader.php. Кроме того, вам придется включать его в каждый новый файл. Больше файлов читает. Меньше производительности.

2. Если бы я начал использовать автозагрузчик SPL, как бы настроить его с моей текущей структурой каталогов?

Структура каталога не имеет значения (при условии, что дерево классов организовано красиво и логично). Важно то, что пространство имен вы указываете внутри своего класса. Например, если вы хотите, чтобы SPL автоматически загружал класс, содержащийся в вашем файле classes/feed/postrank/postrank.php (предположительно, объявление класса postrank), этот файл должен иметь внутри себя декларацию пространства имен, например:

namespace classes\feed\postrank; 
class postrank { 
    ... 
} 

Таким образом, SPL узнает, как найти объявление класса в файловой системе вашего приложения.

3. Есть ли разница в времени загрузки между использованием include/require по сравнению с автозагрузкой SPL?

Если вы включаете все в autoloader.php, вы вынуждаете PHP читать и включать каждый файл. SPL загружает только нужные классы и только тогда, когда они вам понадобятся. Разница во времени может быть заметной, если у вас есть приличное количество файлов и классов (скажем, сотни из них), в зависимости от производительности вашего сервера приложений.

4. Должны ли все классы находиться под одним каталогом «классы?»? или нет проблем с моей файловой структурой?

В зависимости от структуры приложения действительно, так что это полностью ваш звонок.

+0

Хорошо спасибо за это. Можете ли вы рассказать больше о 2? Я собираюсь включить функцию автозагрузки на каждую страницу? Как функция обнаруживает, что я хочу использовать определенный класс, и загружаю только этот конкретный, не загружая все классы. – Relm

+0

Вы должны использовать функцию [spl_autoload()] (http://au.php.net/manual/en/function.spl-autoload.php). Он может использоваться либо в начале каждого файла, который вы хотите запустить на вашем сервере, либо использовать лучший путь и сделать только одну точку входа в приложение, используя (например) подход MVC. Я не могу вникнуть в подробности здесь, не написав небольшую статью, но я уверен, что вы сможете найти больше информации на основе моих предложений. –