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

我有以下代码

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 方法:

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

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

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

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

提前致谢。

有帮助吗?

解决方案

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

郑重声明,如果您不需要为所有派生类无一例外地使用单独的计数器,那么我会考虑显式 protected static $count = 0 在确实需要一个漂亮的解决方案的派生类中:如果你想要自己的计数器,你就要求一个,这一事实仍然写在代码中供每个人查看。

其他提示

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

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

您可以声明 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;
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top