也许我的问题已被问过几次,但是......
我有以下代码
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”:)
我看到两种方式:
protected static $count=0;
使$count
不是整数而是数组。并在inc
和getCount
方法中执行此类操作:
静态:: $计数[get_called_class()] ++;
和
return static::$count[get_called_class()];
但我认为这些方式有点难看。首先 - 让我复制/粘贴,我想避免的。第二 - 好吧,我不知道:)我只是不喜欢它。
有没有更好的方法来实现我想要的?
提前感谢。
答案 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;
}