PHP 扩展类使子级继承相同的静态属性

标签 php static singleton properties factory

我想首先展示一个测试用例:

class A {
    public static $instance=null;
    public function __construct(){
        self::$instance=$this;
    }
    public function className(){
        return get_class(self::$instance);
    }
}

class B extends A {
    public function className(){
        return get_class(self::$instance);
    }
}

// test code
$b=new B();
echo $b->className; // B
$a=new A();
echo $a->className; // A
echo $b->className; // A <- error: not B any more!

注释

  • 我在上面使用了工厂+单例模式。嗯,有一点。
  • 我不需要任何关于“正确实现模式”的规范。我需要解决问题,而不是违反 KISS 行为;)。
  • 批评者可能会说 A 应该是一个接口(interface)。理想情况下,它应该是这样的,但抱歉,这只是一个简单的类。

问题在于 self::$instance 对于所有实例都是相同的。如何为每个类分隔 self::$instance

编辑:我有这个想法:

$GLOBALS['store']=array();
class A {
    public static $instance=null;
    public function __construct(){
        $GLOBALS['store'][__CLASS__]=$this;
    }
}

最佳答案

您可以为每个类名存储一个实例:

class A { 
    public static function getInstance(){
        // Maybe use this function to implement the singleton pattern ...
        return self::$instance[get_called_class()];
    }

    public function className(){
        return get_class(self::getInstance());
    }   
}

关于PHP 扩展类使子级继承相同的静态属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4472195/

相关文章:

java - 如果私有(private)帮助方法可以是静态的,那么它们是否应该是静态的

c# - 单例 - 我可以创建多个实例

c# - DAL和BO层Singleton的正确使用?

php - 格式化数组值

php - 使用php从sql获取登录用户信息

java - JTextField 在静态时在某些页面上消失,而在其他页面上出现

c++ - 静态变量初始化为类成员或局部函数变量(单例示例)

php - 重复过程直到满足条件

php - 如何使图像的背景透明度为0?

java - 如何从父类的静态方法中调用子类的静态方法?