0

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

我有以下代码

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不是整数而是数组。inc并在和getCount方法中做一些这样的事情:

    静态::$count[get_call_class()]++;

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

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

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

提前致谢。

4

3 回答 3

1

不,您已经准确地列出了两个最实用的选项来解决这个问题。PHP 不能变魔术;当你声明一个static protected属性时,你得到的正是:一个属性。如果您提供的语法确实有效,那么对于需要这样做的每个人来说可能是个好消息,但对于其他希望 PHP OOP 以某种理智的方式表现的人来说,这绝对是一个可怕的消息。

并且作为记录,如果您不需要为所有派生类设置一个单独的计数器,那么我认为protected static $count = 0派生类中确实需要一个单独的计数器是一个很好的解决方案:您想要自己的计数器,您要求一个,然后这个事实仍然写在代码中供大家查看。

于 2012-10-02T12:18:44.120 回答
1

我认为对于您要尝试做的事情,在抽象类中只有一个接口方法(例如 getCount()),而在派生类中只有一个计数器,这是您的首选,是最不糟糕的选择。如果您不计算该计数的所有实例,那么在父类中具有抽象静态计数是没有意义的。

总的来说,我认为整个想法有点丑陋,因此实现也会很丑陋:)

于 2012-10-02T12:19:22.400 回答
0

您可以声明受保护的静态 $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;
}
于 2016-07-17T21:02:34.943 回答