Readonly deep dive
| Readonly props | |
| Readonly classes | |
| Clone to modify | |
| Limits |
Readonly props
A readonly property can be written only once. The constructor is the usual place for that single write.
After the first write the value stays fixed, which makes small value objects safe to share across the codebase.
class User { public readonly string $name; public function __construct(string $name) { $this->name = $name; } }
Readonly classes
A readonly class marks every property as readonly at once. You write the keyword once on the class instead of repeating it on each property.
Every property in such a class must carry a type. Static properties are not allowed there, which keeps the class a plain data holder.
readonly class Point { public function __construct( public float $x, public float $y, ) {} }
Clone to modify
A readonly property cannot be reassigned, so cloning is the way to a changed copy. Clone the object and the copy starts with the same values.
Newer PHP adds a shortcut for this pattern, see clone with overrides in PHP 8.5 for the short form.
$a = new User("Ann"); $b = clone $a; echo $b->name;
Limits
Readonly has clear limits. A readonly property must be typed and cannot be static, and the single write cannot happen twice.
Plan the constructor so it receives every value up front. Later code only reads, which removes a whole group of state bugs.
class Config { public function __construct( public readonly string $host, public readonly int $port, ) {} }
Next: Enums deep dive
Article author: Arthur Isaev