我搜索了许多博客和网站,但找不到完美的答案。每当我使用作曲家时,我都必须包括autoload.php文件,然后对于每个要自动加载的类,我都必须将该类与命名空间一起使用。现在,我想知道这个作曲家的优势是什么,在这里我可以轻松地包含类文件通过include_once或require_once而不是分别使用autoload.php和类文件。当我使用作曲家时,我必须编写以下代码:
include_once("vendor/autoload.php"); use namespace/derectoryname/classname;
每当我手动添加
include_once("classname.php");
谁能清除这些?
首先,作曲家的主要优势是处理依赖关系(以及依赖关系的依赖关系,依此类推)。自动装带器正在结霜。
这个问题最好摆在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
不需要您的ClassA 知道您实际在哪里存储该文件。这不是它的工作,也不应该在乎文件系统的实际结构,从而使代码更具可移植性。其他地方的人可能具有vendor
与您不同的结构,并且如果使用自动加载器而不是在require
语句中对文件路径进行硬编码,则仍然可以轻松使用您的代码。
这应该或多或少足以表明自动加载是一种比including
手动需求更现代,高效和可移植的工作方式。
既然你已经在使用的作曲家来处理你的依赖,这是真棒,你得到的好处自动加载机免费!