2017-01-15 2 views
1

Я искал много блогов и веб-сайтов, но я не нашел идеального ответа. всякий раз, когда я использую композитор, я должен включить файл autoload.php, а затем для каждого класса для автозагрузки я должен использовать этот класс с пространством имен. Теперь я хочу знать, в чем преимущество этого композитора, где я могу легко включить класс файл include_once или require_once, а не использовать как autoload.php, так и файл класса отдельно. , когда я использую композитор я должен писать этот код:Почему мы должны использовать композитор, а не использовать include_once или require_once?

include_once("vendor/autoload.php"); 
use namespace/derectoryname/classname; 

всякий раз, когда я включаю вручную, чем

include_once("classname.php"); 

кто может очистить их?

+0

Привет, @ afsana-nasrin, и добро пожаловать в SO. – yivi

ответ

2

Прежде всего, основным преимуществом композитора является обработка зависимостей (и зависимостей зависимостей и т. Д.). Автозагрузчик просто замораживает на торте.

Вопрос будет лучше поставлен как include против автозагрузчика, а затем он станет немного интереснее.

Во-первых, краткость. При одном подходе вы получите два объявления для каждого файла: use и include, тогда как с помощью автозагрузчика вам просто нужно объявить операторы use и позволить автозагрузчику выполнять грязную работу по фактической загрузке файла.

Кроме того, производительность. Если вы include или require свои требования в верхней части вашего файла, вы всегда загрузите этот файл. С автозагрузчиком вы сделаете это только в том случае, если попытаетесь использовать необходимый класс. Пока вы не попытаетесь создать экземпляр или использовать какой-либо из требуемых классов, автозагрузчик не ударит по файловой системе и попытается найти требуемый класс, что сделает его более эффективным и выполнит только работу, когда вам действительно нужна работа.

В несколько сырой, например:

use Namespace\Package\Service\ServiceProvider 
use Namespace\Package\Exception\ServiceProviderException 

if (isset($options['service_id'])) { 
    try { 
     $service = ServiceProvider::getService($options['service_id']); 
    } 
    catch (ServiceProviderException $e) { 
     // do your exception handling 
    } 
} 
else { 
    // and now for something entirely different 
} 

с этим файлом, который декларирует ServiceProvider только собирается загружаться, если вы на самом деле отвечают требованиям, и файл, который объявляет ServiceProviderException только тогда, когда, если вы должны поймать исключение (хотя было бы справедливо, что он был бы включен автозагрузчиком, если ServiceProvider необходимо для это исключение, а не раньше).

Кроме того, у вас есть более четкое разделение проблем. Ваш ClassA, которому необходимо use NameSpace\Package\ClassB, не требуется знать, где вы фактически храните этот файл. Это не его работа, и она не должна заботиться о фактической структуре файловой системы, делая код более переносимым. У кого-то в другом месте может быть другая структура vendor, чем у вас, и вы все равно сможете легко использовать свой код, если он использует автозагрузчик вместо файловых путей hardcoding в ваших операциях require.

Это должно быть более или менее достаточно, чтобы показать вам, что автозагрузка - это гораздо более современный, эффективный и портативный способ работы, чем including ваши требования вручную.

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

+0

Спасибо ... я получил его сейчас. –

Смежные вопросы