[RFC] Data Classes

From: Date: Sat, 23 Nov 2024 13:11:56 +0000
Subject: [RFC] Data Classes
Groups: php.internals 
Request: Send a blank email to internals+get-126030@lists.php.net to get a copy of this message
Hello internals, Born from the Records RFC (https://wiki.php.net/rfc/records) discussion, I would like to introduce to you a competing RFC: Data Classes (https://wiki.php.net/rfc/dataclass). This adds a new class modifier: data. This modifier drastically changes how classes work, making them comparable by value instead of reference, and any mutations behave more like arrays than objects (by vale). If desired, it can be combined with other modifiers, such as readonly, to enforce immutability. I've been playing with this feature for a few days now, and it is surprisingly intuitive to use. There is a (mostly) working implementation available on GitHub (https://github.com/php/php-src/pull/16904) if you want to have a go at it. Example: data class UserId { public function __construct(public int $id) {} } $user = new UserId(12); // later $admin = new UserId(12); if ($admin === $user) { // do something } // true Data classes are true value objects, with full copy-on-write optimizations: data class Point { public function __construct(public int $x, public int $y) {} public function add(Point $other): Point { // illustrating value semantics, no copy yet $previous = $this; // a copy happens on the next line $this->x = $this->x + $other->x; $this->y = $this->y + $other->y; assert($this !== $previous); // passes return $this; } } I think this would be an amazing addition to PHP. Sincerely, — Rob

« previous php.internals (#126030) next »