我知道有一种模式,可以在一个类中添加一个静态计数器来计算该类的实例数。
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()
将分别得到自行车和汽车的数量。
这可能吗?
很大程度上取决于你定义计数器的位置和访问它的方式。 如果你在基类中有1个计数,那么只有1个计数。 如果你在每个类中都有一个计数,那么你需要注意如何访问正确的值。 使用 self
或 static
详见 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
你可以在父类中保留一个计数的数组,而不是只保留一个整数,索引使用 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数组中)将意味着你可以独立地计算它们。但这取决于你。