我搜索了很多博客和网站,但我没有找到任何完美的答案。 每当我使用composer时,我必须包含autoload.php文件,然后为每个类自动加载我必须使用该类与namespace.now我想知道这个作曲家的优点是什么,我可以轻松地包含类文件通过include_once或require_once而不是单独使用autoload.php和类文件。 当我使用作曲家时,我必须编写这些代码:
include_once("vendor/autoload.php");
use namespace/derectoryname/classname;
每当我手动包含时
include_once("classname.php");
任何人都可以清除这些吗?
答案 0 :(得分:2)
首先,作曲家的主要优势是处理依赖关系(以及您的依赖关系和依赖关系等)。自动加载器正好结霜。
问题最好是include
vs autoloader,然后它会变得更有趣。
首先,简洁。使用一种方法,您最终会在每个文件中使用两个声明: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
throw
需要use NameSpace\Package\ClassB
该异常,而不是之前)时,自动加载器会包含它。
最重要的是,你有一个更整洁的关注点分离。需要vendor
的ClassA不需要知道您实际存储该文件的位置。这不是它的工作,也不应该关心文件系统的实际结构,使代码更具可移植性。其他人可能拥有与您不同的require
结构,如果它使用自动加载器,而不是在including
语句中硬编码文件路径,则仍然可以轻松使用您的代码。
这应该或多或少足以向您展示自动加载是一种更加现代,高效且便携的工作方式,而不是手动.not
您的要求。
由于您已经在使用composer处理依赖关系,这是 awesome ,因此您可以免费获得自动加载器的好处!