PHP子类实例的静态实例计数器

问题描述 投票:1回答:2

我知道一种向类添加静态计数器以计算该类的实例数的模式

class Vehicle
{
  private static $_count=0;

  public static function getCount() {
    return self::$_count;
  }

  public function __construct()
  {
    self::$_count++;
  }
}

[我想做的是将几个子类添加到Vehicle中,并独立地计算它们的实例

class Bike extends Vehicle
{
   ...
}

class Car extends Vehicle 
{
   ...
}

因此调用Bike::getCount()Car::getCount()将分别获得自行车和汽车的数量的计数

如果没有这可能吗?>

  • 在子类中重复代码?
  • 在超类中设置某种以类名为键的计数数组?

我知道一种向类添加静态计数器以计算该类类Vehicle的实例数量的模式{private static $ _count = 0;公共静态函数getCount(){...

php inheritance static
2个回答
0
投票

您可以在父类中保留一个计数数组,而不仅仅是使用static:class进行索引的单个整数。与self::不同,它总是引用当前实例的类名。

class Vehicle
{
  private static $counts = [];

  public static function getCount()
  {
      return self::$counts[static::class];
  }

  public function __construct()
  {
      // Using a reference here to avoid undefined-index notices
      $target =& self::$counts[static::class];
      $target++;
  }
}

class Bike extends Vehicle {}

new Bike;
var_dump(Bike::getCount());
// int(1)

0
投票

很大程度上取决于您在何处定义计数以及如何使用它。如果基类中有1个计数,则只有1个计数。如果每个类别都有一个计数,那么您需要知道如何访问正确的值。讨论使用selfstatic更多What is the difference between self::$bar and static::$bar in PHP?

© www.soinside.com 2019 - 2024. All rights reserved.