<?php
/* readonly */ class ImmutableCounter {
public function __construct(private readonly int $count) {}
public function add1(): self { return new self($this->count + 1); }
public function value(): int { return $this->count; }
}
// assuming the proposed RFC is in place, this is now possible:
class MutableCounter extends ImmutableCounter {
public function __construct(private int $count) {}
public function add1(): self { return new self(++$this->count); }
public function value(): int { return $this->count; }
}
$counter1 = new ImmutableCounter(0);
$counter2 = $counter1->add1();
$counter3 = $counter2->add1();
var_dump([$counter1->value(), $counter2->value(), $counter3->value()]);
$mutableCounter1 = new MutableCounter(0);
$mutableCounter2 = $mutableCounter1->add1();
$mutableCounter3 = $mutableCounter2->add1();
var_dump([$mutableCounter1->value(), $mutableCounter2->value(), $mutableCounter3->value()]);