PHP - 自动加载类:在需要时动态实例化对象

时间:2013-06-04 20:59:07

标签: php singleton autoload

这可能会有点复杂,所以我试着以最简单的方式解释它 考虑source.php,其中包含一段代码,这些代码可能需要也可能不需要class1.phpclass2.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();

你为什么这么问?好吧,我几个月前使用Singleton模式编写了一个自定义CMS,我将所有类定义为Static并使用它们:

source.php - 我现在所做的

spl_autoload_register(function ($class) {
   ...
    });
...
Class1::doSomething();
...
Class8::doSomethingElse();

想想100多个源文件和类文件,我会在有人在评论部分指出它们之前回答一些评论。

  • 为什么在第一时间使用静态类? 因为当时我认为这个小技巧只会加载请求的类,它会节省大量的内存和CPU消耗。
  • 那么为什么要从静态类切换? 我们的项目经理已经阅读了一些关于静态类和一个类的实例化的文章,并得出结论,我们必须切换,因为它将有显着的性能改进(虽然我个人知道静态类的缺点但我不相信会有一个显着改善)。
  • 只需在每个类文件的末尾实例化一个对象。它不会有帮助,因为类文件中的实例化对象在sourde文件中仍然无法识别。
  • 第一次使用类并在那里实例化对象。无法完成,因为这些源文件在其他开发人员中没有特别的方式相互包含,即{ {1}}和source1.php都包含在source2.php中,并且都使用相同的类。
  • 您建议什么? 无论如何我们可以在遇到用作对象的未定义变量(如spl_autoload_register)时捕获php,然后相应地加载所请求的类?

TL; DR

如何在使用该类的实例时动态自动加载一个类,这意味着只包含所请求的类而不是盲目地将它们全部包含在内?

1 个答案:

答案 0 :(得分:0)

您在PHP中无法描述的方式,即使可能也不建议使用。

相反,我建议采用更传统的单身人士模式 在你的班上:

class Class8 {
    private $_instance = null;
    public static getInstance() {
        if (is_null(self::$_instance)) {
            self::$_instance = new Class8();
        }
        return self::$_instance;
    }

    // rest of class here, with no static
}

然后,您可以随时拨打Class8::getInstance(),并且每次调用时都会获得相同的课程实例。