为什么我们应该使用 composer 而不是使用 include_once 或 require_once?
Why should we use composer rather than using include_once or require_once?
我搜索了很多博客和网站,但没有找到任何完美的答案。
每当我使用作曲家时,我都必须包含 autoload.php 文件,然后对于每个要自动加载的 class 我都必须将 class 与 namespace.now 一起使用 我想知道什么是利用这个作曲家,我可以轻松地通过 include_once 或 require_once 包含 class 文件,而不是单独使用 autoload.php 和 class 文件。
当我使用作曲家时,我必须编写这些代码:
include_once("vendor/autoload.php");
use namespace/derectoryname/classname;
每当我手动包含时
include_once("classname.php");
谁能清除这些?
首先,composer 的主要优势是处理依赖项(以及您的依赖项的依赖项,等等)。自动加载器只是锦上添花。
这个问题最好是 include
vs autoloader,然后它会变得更有趣。
首先,简洁。使用一种方法,您最终会为每个文件使用两个声明:use
和 include
,而使用自动加载器您只需要声明 use
语句,然后让自动加载器执行实际加载文件的脏工作。
还有,性能。如果您 include
或 require
您的要求位于文件顶部,您将始终加载其他文件。使用自动加载器,只有当您实际尝试使用所需的 class 时,您才会这样做。在您尝试实例化或使用任何必需的 class 之前,自动加载器不会访问文件系统并尝试找到所需的 class,从而提高效率,并且仅在您实际需要时才进行工作作品。
举个粗略的例子:
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
的 ClassA 不需要知道您实际存储该文件的位置。这不是它的工作,也不应该关心文件系统的实际结构,从而使代码更具可移植性。其他地方的人可能有与您不同的 vendor
结构,如果它使用自动加载器,而不是在您的 require
语句中硬编码文件路径,仍然可以轻松使用您的代码。
这应该或多或少足以向您展示自动加载是一种比 including
手动加载您的要求更现代、更高效、更便携的工作方式。
并且由于您已经在使用 composer 来处理您的依赖项,很棒,您可以免费获得自动加载器的好处!
我搜索了很多博客和网站,但没有找到任何完美的答案。 每当我使用作曲家时,我都必须包含 autoload.php 文件,然后对于每个要自动加载的 class 我都必须将 class 与 namespace.now 一起使用 我想知道什么是利用这个作曲家,我可以轻松地通过 include_once 或 require_once 包含 class 文件,而不是单独使用 autoload.php 和 class 文件。 当我使用作曲家时,我必须编写这些代码:
include_once("vendor/autoload.php");
use namespace/derectoryname/classname;
每当我手动包含时
include_once("classname.php");
谁能清除这些?
首先,composer 的主要优势是处理依赖项(以及您的依赖项的依赖项,等等)。自动加载器只是锦上添花。
这个问题最好是 include
vs autoloader,然后它会变得更有趣。
首先,简洁。使用一种方法,您最终会为每个文件使用两个声明:use
和 include
,而使用自动加载器您只需要声明 use
语句,然后让自动加载器执行实际加载文件的脏工作。
还有,性能。如果您 include
或 require
您的要求位于文件顶部,您将始终加载其他文件。使用自动加载器,只有当您实际尝试使用所需的 class 时,您才会这样做。在您尝试实例化或使用任何必需的 class 之前,自动加载器不会访问文件系统并尝试找到所需的 class,从而提高效率,并且仅在您实际需要时才进行工作作品。
举个粗略的例子:
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
的 ClassA 不需要知道您实际存储该文件的位置。这不是它的工作,也不应该关心文件系统的实际结构,从而使代码更具可移植性。其他地方的人可能有与您不同的 vendor
结构,如果它使用自动加载器,而不是在您的 require
语句中硬编码文件路径,仍然可以轻松使用您的代码。
这应该或多或少足以向您展示自动加载是一种比 including
手动加载您的要求更现代、更高效、更便携的工作方式。
并且由于您已经在使用 composer 来处理您的依赖项,很棒,您可以免费获得自动加载器的好处!