2015-04-01 34 views
2

现在假设我有几个类都在一个文件中,我运行作曲家dump-autoload -o,我尝试使用它的任何工作类,现在如何将所有这些类都包含到单个文件中使用require_once,应该也有效吗?我问这与我之前问的问题,还没有得到答复:Loading external libraries in laravel-5Composer Dump-Autoload Scan需要文件吗?

现在,当我转储每个需要的文件的内容(类)到单个文件中,我可以使用这些类,但是当我使用require_once我总是没有找到类?是否有一个原因?或者我只是没有正确使用它?

为了进一步澄清什么,我问:

require_once("Class_1.php"); 
require_once("Class_2.php"); 
require_once("Class_3.php"); 
require_once("Class_4.php"); 

针对这样的:

class Class_1 extends Class_Extender_1 {..} 
class Class_2 extends Class_Extender_2 {..} 
class Class_3 extends Class_Extender_3 {..} 
class Class_4 extends Class_Extender_4 {..} 

回答

0

给定文件src/require-everything.php,内容如下

require_once("Class_1.php"); 
require_once("Class_2.php"); 
require_once("Class_3.php"); 
require_once("Class_4.php"); 

composer.json与以下G含量

{ 
    "autoload": { 
     "files": ["src/require-everything.php"] 
    } 
} 

文件src/require-everything.php将始终自动加载, 当你包括作曲的供应商/ autoload.php(你转储与作曲家自动加载磁带机后)。

请考虑这样一个事实,即该文件被加载在每个请求!

它等同于你的bootstrap放置require 'src/require-everything.php';

我的建议是真正使用自动加载:要么通过包装要求在一类本身或使用类映射自动加载(与类的文件夹)的一部分。

{ 
    "autoload": { 
     "classmap": ["src/folder-with-classes/"] 
    } 
} 

将扫描所有.php文件的文件夹,并提取所有类名。这些数据形成了关系为classname => filename的等级图。现在,如果你在你的应用程序中使用Class_1,作曲家自动加载机将使用相应的文件名自动加载它。

1

你应该避免做手工自动加载优化。

我在this answer中说过,类映射自动加载(这也是在转储“优化”自动加载器时完成的)并不是每种情况下最快的解决方案,它取决于执行的代码。你必须测量它是否加速了任何事情,否则你可能会在不知不觉中变得更糟。

这同样适用于将多个类合并成一个文件。这样做的好处是通过访问较少的文件来减少磁盘I/O。缺点是更多的代码在每种情况下都不需要执行,并使用更多的内存。此外,它创建了一个不太明显的代码结构,所以它可能也是一个维护缺陷。

人类在猜测什么样的策略是最好的时候通常很糟糕 - 但他们不需要,他们有机器可以完成所有这些优化。这也是你应该尝试的。不要在开始时摆弄优化的自动加载 - 寻找一个好的代码结构,使用PSR-4自动加载(每个文件需要一个类,这是一件好事),并在应用程序接近完成时进行优化。

+0

实际上使用psr-4来自动加载那个需要其他文件的文件,每个类都扩展了一些其他的类,所以我实际上需要它们都被自动加载。 – user3718908 2015-04-01 23:08:45

+0

但是你不需要自己做 - 这就是自动加载的意义。通过优化单个数据库查询,您可能会获得更多的性能,而不是通过优化PHP中类的加载。记住:你不能优化你无法衡量的东西。继续,使用分析器,确定你获得的速度增益。如果这很重要,则应用它。如果不是 - 暂时忽略。如有必要,稍后再回来。 – Sven 2015-04-01 23:26:54

+0

还有一点,因为我们正在讨论优化自动加载:不要使用'* _once()'函数。自动加载只会自动进行一次,但这些功能需要跟踪哪些文件已加载,哪些文件对性能也有影响。 – Sven 2015-04-01 23:29:16