我搜索了很多博客和网站,但没有找到任何完美的答案。每当我使用composer时,我都必须包括autoload.php文件,然后对于每个要自动加载的类,我必须将该类与命名空间一起使用。现在我想知道这个composer的优点是什么,我可以通过include_one或require_one轻松地包括类文件,而不是分别使用autoload.php和类文件。当我使用composer时,我必须编写以下代码:
include_once("vendor/autoload.php");
use namespace/derectoryname/classname;
无论何时我手动包括
include_once("classname.php");
有人能清理这些吗?
首先,composer的主要优势是处理依赖关系(以及依赖关系的依赖关系,等等)。自动装弹机只是在蛋糕上结霜。
这个问题最好作为include
与自动加载器来提出,然后它会变得稍微有趣一些。
第一,简洁。使用一种方法,每个文件将使用两个声明:use
和include
,而使用自动加载器,您只需要声明use
语句,并让自动加载器完成实际加载文件的肮脏工作。
还有性能。如果您在文件的顶部include
或require
您的需求,您将始终加载另一个文件。使用自动加载器,只有当您真正尝试使用所需的类时,您才能这样做。在您尝试实例化或使用任何必需的类之前,自动加载器不会访问文件系统并尝试找到必需的类,从而使其更加高效,并且只在您实际需要工作时才执行工作。
举个有点粗糙的例子:
use NamespacePackageServiceServiceProvider
use NamespacePackageExceptionServiceProviderException
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 NameSpacePackageClassB
的ClassA不需要知道该文件的实际存储位置。这不是它的工作,也不应该关心文件系统的实际结构,从而使代码更具可移植性。其他地方的某个人可能与你有不同的vendor
结构,如果它使用自动加载器,而不是在require
语句中硬编码文件路径,那么仍然可以很容易地使用你的代码。
这或多或少应该足以向您表明,与手动including
相比,自动加载是一种更现代、更高效、更便携的工作方式。
由于您已经在使用composer来处理您的依赖关系,这是很棒的,因此您可以免费获得自动加载器的好处!