PHP中的后期静态绑定,子类之间共享变量

时间:2012-10-02 12:14:58

标签: php static late-static-binding

也许我的问题已被问过几次,但是......

我有以下代码

abstract class ParentClass
{
    protected static $count=0;
    public static function inc()
    {
        static::$count++;
    }
    public static function getCount()
    {
        return static::$count;
    }
}

class FirstChild extends ParentClass
{

}
class SecondChild extends ParentClass
{

}

我就像这样使用它

FirstChild::inc();
echo SecondChild::getCount();

它显示我“1”。而你可能猜测我需要“0”:)

我看到两种方式:

  1. 为每个派生类添加protected static $count=0;
  2. 使$count不是整数而是数组。并在incgetCount方法中执行此类操作:

    静态:: $计数[get_called_class()] ++;

  3. return static::$count[get_called_class()];
    

    但我认为这些方式有点难看。首先 - 让我复制/粘贴,我想避免的。第二 - 好吧,我不知道:)我只是不喜欢它。

    有没有更好的方法来实现我想要的?

    提前感谢。

3 个答案:

答案 0 :(得分:1)

不,你已经准确地列出了两个最实用的选项来解决这个问题。 PHP无法发挥魔力;当您声明static protected属性时,您会得到以下内容:一个属性。如果你给出的语法对于每个需要这样做的人来说都是好消息,但对于那些希望PHP OOP以一种有点理智的方式行事的人来说,这绝对是一个可怕的消息。

对于记录,如果你不需要为所有派生类单独使用一个单独的计数器,那么我认为派生类中的显式protected static $count = 0确实需要一个是一个漂亮的解决方案:你想要自己的反击,你要求一个,这个事实仍然写在代码中供所有人看。

答案 1 :(得分:1)

我认为对于你要做的事情,在抽象类中只有一个接口方法(比如getCount()),而衍生类中的计数器,你的第一选择,是最差的选择。如果您没有计算该计数的所有实例,那么在父类中使用抽象静态计数是没有意义的。

总的来说,我认为整个想法有点难看,因此实施也会很难看:)

答案 2 :(得分:0)

你可以声明protected static $ count = 0;对于每个子类,这种方式对于每个子类都是唯一的,但对于所有类的实例都是通用的。这是他解决问题最优雅的方法。

abstract class ParentClass
{
    public static function inc()
    {
        static::$count++;
    }
    public static function getCount()
    {
        return static::$count;
    }
}

class FirstChild extends ParentClass
{
    protected static $count=0;
}
class SecondChild extends ParentClass
{
    protected static $count=0;
}