A readonly
class can be great way for creating value-objects in PHP:
// PHP 8.2+ readonly class Person { public function __construct( public string $name, public int $age, ) {} } $person = new Person('John', 42); echo "$person->name is $person->age years old"; // John is 42 years old
However, in a more general sense, a readonly
class in PHP is used for:
- Implicitly making all instance properties of a class
readonly
; - Preventing the creation of dynamic properties (even with the
#[AllowDynamicProperties]
attribute).
For example:
// PHP 8.2+ readonly class Foo { public int $bar; public function __construct() { $this->bar = 1; } } $foo = new Foo(); // Fatal error: Uncaught Error: Cannot modify readonly property Foo::$bar ... $foo->bar = 2; // Fatal error: Uncaught Error: Cannot create dynamic property Foo::$baz ... $foo->baz = 1;
To not violate the readonly
constraint, adding the #[AllowDynamicProperties]
attribute to a readonly
class will throw a compile-time error:
// PHP 8.2+
// Fatal error: Cannot apply #[AllowDynamicProperties] to readonly class Foo ...
#[AllowDynamicProperties]
readonly class Foo { /* ... */ }
Please note that readonly
classes cannot have untyped or static
properties.
This post was published by Daniyal Hamid. Daniyal currently works as the Head of Engineering in Germany and has 20+ years of experience in software engineering, design and marketing. Please show your love and support by sharing this post.