If you want a new data object with slightly different values

struct Data2 extends Data
{
    {string $t, array $meta} $title; // Overwrite parent type
    Status $status;
    {int $x, int $y} $inlineAnonymous = {x: 1, y: 2};
}

Regarding array functions and serialization, there are two approaches:
ArrayAccess: We can implement array functions similar to ArrayObject, making it 
possible to use array functions on readonly structs.
Conversion to/from Indexed Array: Since these structs are restricted to a 
default constructor with named/positional arguments, we can easily convert to 
and from indexed arrays. JSON serialization can also be supported with the 
property names as keys.
For example:
foreach (Data as ($propertyName =>)? $property) {} //not real syntax, but you 
get the idea
However, it's important to note that readonly structs are not meant to replace 
arrays or lists and, ultimately, are not arrays.

Allowing Methods in Structs:
Initially, I suggested that readonly structs have no methods besides the 
constructor. However, upon further consideration, I believe it may be 
beneficial to allow methods in structs. Even PHP enums allow methods, and 
considering this, I am open to discussing and potentially having a vote on 
allowing methods within structs as part of the RFC discussion.

Cheers,
Lanre

On 2023-09-08 7:35 a.m., Robert Landers wrote:
On Fri, Sep 8, 2023 at 3:12 PM Lanre Waju <la...@online-presence.ca> wrote:
Dear PHP Internals,

I am writing to propose a new feature for PHP that introduces the
concept of structs. This feature aims to provide a more concise and
expressive way to define and work with immutable data structures. Below
is a detailed description of the proposed syntax, usage, and behavior.

Syntax

struct Data
{
      string $title;
      Status $status;
      ?DateTimeImmutable $publishedAt = null;
}
The Data struct is essentially represented as a readonly class with a
constructor as follows:


readonly class Data
{
      public function __construct(
          public string $title,
          public Status $status,
          public ?DateTimeImmutable $publishedAt = null,
      ) {}
}
Assertions
The Data struct will always be readonly.
It has no methods besides the constructor.
Constructors
The Data struct can be constructed in three different ways, each of
which allows for named or positional arguments, which can be mixed:

1.1 Class like
$data = new Data('title', Status::PUBLISHED, new DateTimeImmutable());

1.2 Class like (Named Syntax)
$data = new Data(title: 'title', status: Status::PUBLISHED, publishedAt:
new DateTimeImmutable());

2.1 Proposed struct initialization syntax (Positional Arguments)
$data = Data{'title', Status::PUBLISHED, new DateTimeImmutable()};

2.2 Proposed struct initialization syntax (Named Syntax)
$data = Data{title: 'title', status: Status::PUBLISHED, publishedAt: new
DateTimeImmutable()};

3.1 Anonymous Struct (Named Arguments)

$data = struct {
      string $title;
      Status $status;
      ?DateTimeImmutable $publishedAt = null;
}('title', Status::PUBLISHED, new DateTimeImmutable());
3.2 Anonymous Struct (Named Arguments - Named Syntax)

$data = struct {
      string $title;
      Status $status;
      ?DateTimeImmutable $publishedAt = null;
}(title: 'title', status: Status::PUBLISHED, publishedAt: new
DateTimeImmutable());
Nesting
The proposed feature also supports nesting of structs. For example:


final class HasNestedStruct
{
      NestedStruct {
          string $title;
          Status $status;
          ?DateTimeImmutable $publishedAt = null;
      };

      public function __construct(
          public string $string,
          public Data $normalStruct,
          public NestedStruct $nestedStruct = NestedStruct{'title',
Status::PUBLISHED, new DateTimeImmutable()},
          public struct InlineNamed { int $x} $inlineNamed = {x: 1},
          public { int $x, int $y} $inlineAnonymous = {x: 1, y: 2},
      ) {}
}
This proposal aims to enhance the readability and maintainability of
code by providing a more concise and expressive way to work with
immutable data structures in PHP.
I believe this feature will be a valuable addition to the language as it
not only opens the door for future enhancements (eg. typed json
deserialization, etc.), but should also help reduce reliance on arrays
by providing a more expressive alternative.

Your feedback and suggestions are highly appreciated, and we look
forward to discussing this proposal further within the PHP internals
community.

Sincerely
Lanre

--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: https://www.php.net/unsub.php

FWIW (and it isn't worth much), I'm not a fan of the braces styles
(2.1, 2.2) as it is very non-php-ish.

It'd be great to still have methods, e.g., $data->isAfter($date) or
something. Otherwise, it isn't very useful except as typed arrays,
without any of the usefulness of the array functions.

Also, what if I want a new $data object but with slightly different
property values?


--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: https://www.php.net/unsub.php

Reply via email to