PHP 中的后期静态绑定,变量在子类之间共享
-
12-12-2019 - |
题
也许我的问题已经被问过好几次了,但是......
我有以下代码
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
方法:静态::$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;
}