1

我从 habrahabr.ru 上的一些文章中获得了这段代码:

abstract class Singleton {

    protected static $_instances = array();

    protected function __construct() {
    }

    public static function getInstance() {

            $class = \get_called_class();
            if ( !isset( static::$_instances[$class] ) )
                    static::$_instances[$class] = new static;

            return static::$_instances[$class];

    }

}

作者使用它,例如,

class B extends Singleton {

    private $_a = 10;

}

但是在这种情况下,我无法理解“静态”和“自我”之间的主要区别:例如,如果我们将 $_instances 定义为 public 并尝试创建另一个类,例如

class C extends Singleton {

    private $_z =  55;

}

并将 Singleton 定义为非抽象类,在每次调用 getInstance 之后,我们在两种情况下都有相同的实例数组:使用 static::$_instances 和 self::$_instances:

$s = Singleton::getInstance();

print_r(Singleton::$_instances);
print_r(B::$_instances);
print_r(C::$_instances);

$b_instance = B::getInstance();

print_r(Singleton::$_instances);
print_r(B::$_instances);
print_r(C::$_instances);

$c_instance = C::getInstance();

print_r(Singleton::$_instances);
print_r(B::$_instances);
print_r(C::$_instances);

谁能帮助我并告诉我,为什么 $_instances 数组是相同的,为什么作者使用静态而不是自我?非常感谢,对不起我的英语。

4

1 回答 1

2

所有类共享同一个静态数组 $_instances,包含在 Singleton 类中。作者使用“新静态”的原因;是将被调用类的对象存储在该数组中。因为只有一个数组,所以从 Singleton 类中调用该数组的 self:: 和 static:: 将返回相同的数据。

所以,澄清一下,当你打电话时:

$b_instance = B::getInstance();

B 的一个实例被添加到存储在 Singleton 中的 $_instances 数组中。如果您将静态 $_instances 属性添加到 B 或 C 类,则行为会有所不同,因为新创建的实例将存储在其自己的类静态 $_instances 属性中。

于 2011-03-02T09:40:42.647 回答