-2

这可能会有点复杂,所以我尝试以最简单的方式解释它。
考虑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.phpsource3.php
  • 你有什么建议? 无论如何,当遇到用作对象的未定义变量(如 spl_autoload_register)时,我们是否可以捕获 php,然后相应地加载请求的类?

TL;博士

当使用该类的实例时如何动态自动加载该类,这意味着只包含请求的类而不是盲目地包含它们?

4

1 回答 1

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(),每次调用时你都会得到相同的类实例。

于 2013-06-04T21:46:16.380 回答