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() 将分别得到自行车和汽车的数量。

这可能吗?

  • 在子类中重复代码?
  • 在超类中设置某种以类名为键的计数数组?
php inheritance static
2个回答
2
投票

很大程度上取决于你定义计数器的位置和访问它的方式。 如果你在基类中有1个计数,那么只有1个计数。 如果你在每个类中都有一个计数,那么你需要注意如何访问正确的值。 使用 selfstatic 详见 PHP中self::$bar和static::$bar的区别是什么?

class Vehicle
{
    protected static $_count=0;

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

    public function __construct($type, $year)
    {
        // Access the count in the current class (Bike or Car).
        static::$_count++;
        // Access the count in this class
        self::$_count++;
    }
}

class Bike extends Vehicle
{
    protected static $_count=0;
}

class Car extends Vehicle
{
    protected static $_count=0;
}

这两个都有,而且在构造函数中,它把它们都递增了。 这意味着有一个所有车辆和每种类型的总...

echo "Vehicle::getCount()=".Vehicle::getCount().PHP_EOL;
echo "Car::getCount()=".Car::getCount().PHP_EOL;
echo "Bike::getCount()=".Bike::getCount().PHP_EOL;
$a = new Car("a", 1);
echo "Vehicle::getCount()=".Vehicle::getCount().PHP_EOL;
echo "Car::getCount()=".Car::getCount().PHP_EOL;
echo "Bike::getCount()=".Bike::getCount().PHP_EOL;
$a = new Bike("a", 1);
echo "Vehicle::getCount()=".Vehicle::getCount().PHP_EOL;
echo "Car::getCount()=".Car::getCount().PHP_EOL;
echo "Bike::getCount()=".Bike::getCount().PHP_EOL;

给出了(虽然不是很清楚)......

Vehicle::getCount()=0
Car::getCount()=0
Bike::getCount()=0
Vehicle::getCount()=1
Car::getCount()=1
Bike::getCount()=0
Vehicle::getCount()=2
Car::getCount()=1
Bike::getCount()=1

3
投票

你可以在父类中保留一个计数的数组,而不是只保留一个整数,索引使用 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)

完整的演示在这里。https:/3v4l.orgQibd7

我也同意 @u_mulder 的评论,这是个有点不寻常的模式。一个类定义应该只关注单个实例的属性,而不是存储全局状态。维护一个实例的集合(即使是在一个普通的PHP数组中)将意味着你可以独立地计算它们。但这取决于你。

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