我们为什么要使用composer而不是使用include_once或require_once?

时间:2017-01-15 10:58:38

标签: php

我搜索了很多博客和网站,但我没有找到任何完美的答案。 每当我使用composer时,我必须包含autoload.php文件,然后为每个类自动加载我必须使用该类与namespace.now我想知道这个作曲家的优点是什么,我可以轻松地包含类文件通过include_once或require_once而不是单独使用autoload.php和类文件。 当我使用作曲家时,我必须编写这些代码:

include_once("vendor/autoload.php");
use namespace/derectoryname/classname;
每当我手动包含

include_once("classname.php");

任何人都可以清除这些吗?

1 个答案:

答案 0 :(得分:2)

首先,作曲家的主要优势是处理依赖关系(以及您的依赖关系和依赖关系等)。自动加载器正好结霜。

问题最好是include vs autoloader,然后它会变得更有趣。

首先,简洁。使用一种方法,您最终会在每个文件中使用两个声明:useinclude,而使用自动加载器时,您只需要声明use语句,并且让自动加载器执行实际加载文件的脏工作。

另外,表现。如果您在文件顶部includerequire要求,则始终会加载其他文件。使用自动加载器,只有在您真正尝试使用所需的类时才会这样做。在您尝试实例化或使用任何所需的类之前,自动加载器不会访问文件系统并尝试查找所需的类,使其更有效,并且只在您实际需要工作时才进行工作。

作为一个粗略的例子:

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 throw需要use NameSpace\Package\ClassB该异常,而不是之前)时,自动加载器会包含它。

最重要的是,你有一个更整洁的关注点分离。需要vendor的ClassA不需要知道您实际存储该文件的位置。这不是它的工作,也不应该关心文件系统的实际结构,使代码更具可移植性。其他人可能拥有与您不同的require结构,如果它使用自动加载器,而不是在including语句中硬编码文件路径,则仍然可以轻松使用您的代码。

这应该或多或少足以向您展示自动加载是一种更加现代,高效且便携的工作方式,而不是手动.not您的要求。

由于您已经在使用composer处理依赖关系,这是 awesome ,因此您可以免费获得自动加载器的好处!