On 14 March 2025 23:37:08 GMT, Rob Landers <rob@bottled.codes> wrote:
>I could get behind `::`, but I feel that it introduces human ambiguity. I 
>don't believe it would introduce compiler ambiguity, but as a human, I have to 
>hope the programmers are using a style that makes it obvious what are inner 
>classes and what are constants/methods.

As far as I can see, all four languages I looked up last night (Java, C#, 
Swift, Kotlin) use the same syntax for accessing a nested type as for accessing 
a property or method, so we'd be following the crowd to use "::"

That said, I think they all also use that same syntax for namespace (or 
equivalent) lookups, so the same argument can be made for "\". (Why PHP 
separates those isn't entirely clear to me.)

Having some new syntax makes them feel more "exotic" to me. The C# and Swift 
docs give the impression that nesting types is "just something that can 
happen", rather than a whole new language concept to learn.

Java's "inner classes" are something different, and I think we should avoid 
using that term.



> Furthermore, I'm relatively certain this approach can be slightly modified to 
> support "namespace private/protected" classes, in general. So, that will also 
> possibly be a follow-up RFC and having them mixed up will complicate things. 
> In any case, I am not a fan of using the namespace separator here.

To me namespace, module, or file visibility seem like much more natural 
additions to the language, and to solve most of the same problems as nesting 
types.

I guess a public nested class is a bit like a "friend class"? In that it has 
special access to its surrounding class, but otherwise might as well just be 
sharing a namespace with it. But it's also necessarily in the same file, so 
marking those members "file private" rather than "private" would also allow 
that.

A private nested class can only be explicitly mentioned within that narrow 
context, which again feels very much equivalent to "file private".


> $user = new User:>Builder("Rob")->withEmail("rob@bottled.codes")->build();
>
> The user builder is intrinsically tied to the User class itself, it isn't 
> just a namespace. The user builder shares scope with the user class and is 
> able to be the only way to construct a user (barring reflection).

If we had either file or namespace visibility, exactly the same thing could be 
achieved with those, and would look like this: 

$user = new User\Builder("Rob")->withEmail("rob@bottled.codes")->build();

The "User" class would have a "file private" or "namespace private" 
constructor, callable from the "User\Builder" class but not elsewhere; the 
build() method would return the "User" instance.



I think I'm coming to the conclusion that we should use backslash: nested types 
can be viewed as a shorthand way of having a class and namespace with the same 
name, plus applying some visibility rules to that namespace.

Rowan Tommins
[IMSoP]

Reply via email to