On Mon, Jul 21, 2025, at 13:02, Nick wrote:
> 
>> On 17. Nov 2024, at 06:14, Rob Landers <rob@bottled.codes> wrote:
>> 
>> Hello internals,
>> 
>> I'm ready as I'm going to be to introduce to you: "Records" 
>> https://wiki.php.net/rfc/records!
>> 
>> Records allow for a lightweight syntax for defining value objects. These are 
>> superior to read-only classes due to having value semantics and far less 
>> boilerplate, for most things developers use read-only classes for. They are 
>> almost as simple to use as arrays (and provide much of the same semantics), 
>> but typed.
>> 
>> As an example, if you wanted to define a simple User record:
>> 
>> record User(string $emailAddress, int $databaseId);
>> 
>> Then using it is as simple as calling it like a function, with the & symbol:
>> 
>> $rob = &User("rob@bottled.codes", 1);
>> 
>> Since it has value semantics, we can get another instance, and it is 
>> strongly equal to another of the same parameters:
>> 
>> $otherRob = &User("rob@bottled.codes", 1);
>> assert($otherRob === $rob); // true
>> 
>> Records may also have methods (even hooks), use traits, and implement 
>> interfaces:
>> 
>> record Vector3(float $x, float $y, $z) implements Vector {
>>   use Vector;
>>   public float magnitude {
>>     get => return sqrt($this->x ** 2 + $this->y ** 2 + $this->z ** 2)
>>   }
>> }
>> 
>> Further, an automatic (but overridable) "with" method is generated for every 
>> record. This allows you to get a new record similar to a given one, very 
>> easily:
>> 
>> record Planet(string $name);
>> 
>> $earth = &Planet("earth");
>> $mars = $earth->with(name: "mars");
>> 
>> The depth of records was an immense exploration of the PHP engine, language 
>> design, and is hopefully quite powerful for the needs of everyday PHP and 
>> niche libraries. I took care in every aspect and tried to cover every 
>> possible case in the RFC, but I still probably missed some things. I plan on 
>> having a full implementation done by the end of the year and open to a vote 
>> by the end of January, but I'd like to open the discussion up here first. 
>> Love it or hate it, I'd like to hear your thoughts.
>> 
>> — Rob
> 
> 
> Hey Rob,
> 
> We just discussed  your RFCs here. We noticed this in the RFC:
> 
> ```php
> $point1 = &Point(3, 4);
> $point2 = $point1; // No data duplication, $point2 references the same data 
> as $point1
> $point3 = Point(3, 4); // No data duplication, it is pointing to the same 
> memory as $point1
> ```
> 
> Is the `&` on the 3rd line `Point` omitted intentionally or was that just 
> missed?
> If not missed, how is that not ambiguous?
> 
> Could you please clarify?
> 
> *Cheers,*
> Nick

The & was originally a way to signal to the engine that this was going to be a 
Record (for autoloading) but I think I realized it is actually valid PHP code? 
I don't remember why I removed it specifically. I like the Point::(3, 4) 
syntax, when I think about it.

— Rob

Reply via email to