PHP扩展类使子级继承相同的静态属性 [英] PHP Extending class makes children inherit same static property

查看:92
本文介绍了PHP扩展类使子级继承相同的静态属性的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I'd like to start by showing a test case:

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!

注释

  • 我在上面使用的是factory + singleton模式.好吧.
  • 我不需要任何有关正确实现模式"的规范.我需要解决问题,而不是违反KISS的;).
  • 评论家可能会说A应该是接口.理想情况下,应该是这样,但是很简单,很抱歉.
  • I'm using a factory+singleton patterns above. Well, somewhat.
  • I don't need any specs on "implementing patterns correctly". I need problem solving, not KISS violations ;).
  • Critics might say A should be an interface. Ideally, that's what it should have been, but it's just a simple class, sorry.

问题在于所有实例的self::$instance都相同.如何为每个班级分开self::$instance?

The issues lies in the fact that self::$instance is the same for all instances. How do I separate self::$instance for each class?

我有这个主意:

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

推荐答案

您可以按类名称存储实例:

You could store an instance per class name:

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扩展类使子级继承相同的静态属性的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆