Hey internals,

You may remember my RFC about Records (https://wiki.php.net/rfc/records). There 
was something intentionally left out, and due to life events, I am quite behind 
schedule on this one. BUT, what I left out (and the main reason for the short 
syntax) is the ability to have locally scoped records in a class definition.

Example using an anonymous record:

$x = new class {
  public record Point(int $x, int $y);

  // from inside the class, there is no special scope
  public function foo(): Point {
    return new Point(1, 1);
  }
}

$point = new $x::Point(1, 2);

Anyway, I think I've settled on an implementation that is acceptable, but I 
wanted your feedback before moving forward.

Instead of this being limited to Records -- an entirely new type of type and 
syntax -- would we rather have short class declarations (similar to the rules 
in the Records RFC) and locally scoped classes?

class Outer {
  // able to be instantiated from anywhere
  public class Inner(int $y);
  // a private/protected class can only be instantiated within methods/classes 
bound to Outer
  protected readonly class ProtectedInner(int $z);
}

Instantiation is done by static access: new Outer::Inner(1), which is currently 
a syntax error. Public nested classes may be used as type hints and return 
types as well as properties in other classes.

There are quite a few more things left to investigate before updating the RFC 
(or drafting a new one), but I am at a crossroads and I wanted to gather 
people's feedback first. If this is a big "NO" (or if someone else has started 
working on this and I'm just so happening to accidentally step on their toes, 
again): I don't want to spend several days/weeks digging into the details for 
classes. However, it would probably look something like the above.

Note, this doesn't preclude you from using a longer syntax, if that is your 
preference.

class Outer {
  public class Inner {
    public function __construct(public int $z) {}
  }
}

Anyway, I'd love to hear any preferences or thoughts -- strong or otherwise. I 
probably won't reply, but I will read everything and take it into consideration 
as I continue down this road.

Also, if there is already someone working on this ... please speak up so I 
don't get accused of stealing ideas again!

— Rob

Reply via email to