这可能会有点复杂,所以我尝试以最简单的方式解释它。
考虑source.php
哪一段代码可能需要也可能不需要在 中定义的某些类,class1.php
依此class2.php
类推。
source.php - 典型的自动加载
// Simple autoloader, nothing fancy
spl_autoload_register(function ($class) {
$requested_file = strtolower($class) . '.php';
if (file_exists($requested_class)) {
require_once($requested_class);
} else {
throw new Exception("Unable to load $class.");
}
});
...
$class1 = new Class1();
class1->doSomething();
...
$class8 = new Class8();
class8->doSomethingElse();
基本上我想省略对象实例化并立即使用对象,如下所示:
source.php - 我想要实现的目标
spl_autoload_register(function ($class) {
...
});
...
$class1->doSomething();
...
$class8->doSomethingElse();
你为什么问?好吧,几个月前我使用单例模式编写了一个自定义 CMS,我将所有类定义为静态并像这样使用它们:
source.php - 我现在做什么
spl_autoload_register(function ($class) {
...
});
...
Class1::doSomething();
...
Class8::doSomethingElse();
想想超过 100 个源文件和类文件,我在这里回答一些评论,然后有人在评论部分指出它们。
- 你为什么首先使用静态类? 因为当时我认为用这个小技巧只会加载请求的类,它会节省大量的内存和 CPU 消耗。
- 那你为什么要从静态类切换呢? 我们的项目经理阅读了一些关于静态类与类的实例化的文章,并得出结论认为我们必须切换,因为它会显着提高性能(虽然我个人知道静态类的缺点,但我不相信会有很显着的提高)。
- 只需在每个类文件的末尾实例化一个对象。它不会有帮助,因为类文件中的实例化对象在 sourde 文件中仍然无法识别。
- 找到你第一次使用一个类并在那里实例化一个对象。不能这样做,因为这个源文件被其他开发人员以没有特别的方式相互包含,即它们都包含在
source1.php
并且都使用同一个类。source2.php
source3.php
- 你有什么建议? 无论如何,当遇到用作对象的未定义变量(如 spl_autoload_register)时,我们是否可以捕获 php,然后相应地加载请求的类?
TL;博士
当使用该类的实例时如何动态自动加载该类,这意味着只包含请求的类而不是盲目地包含它们?