> On 7 Jul 2021, at 23:16, Larry Garfield <la...@garfieldtech.com> wrote: > > On Wed, Jul 7, 2021, at 7:32 AM, Brent Roose wrote: >> Hi internals >> >> With the readonly properties RFC almost certainly accepted, I'd like to >> discuss an idea that's slightly related to them. >> >> One of the problems that readonly properties solve is that they reduce >> the overhead of writing getters and setters. This is especially >> noticeable in objects that hold lots of data — data transfer objects, >> value objects, entities. And while public readonly properties will be a >> style of programming that not everyone likes, it's clear from the vote >> on the readonly RFC, as well as the community feedback, that it's a >> feature wanted by many. >> >> That brings me to interfaces: currently we're only allowed to define >> methods on interfaces; historically this makes sense, since interfaces >> are meant to define behaviour, and not the implementation. Most OO >> language define behaviour using methods, and state using properties, >> which in turn are used to define the implementation. >> >> But now, readonly properties are added. >> >> Suddenly, class properties aren't just used for state anymore, they are >> also used to expose that state in an immutable way to the outside, >> where we'd use public getters (behaviour) and private properties >> (state) in the past, we can now combine them as public readonly >> properties. Wouldn't that imply that there are at least some cases >> where interface properties could also make sense? >> >> A simple example: >> >> Imagine we've got 10 different classes that share some behaviour: they >> are identifiable by a UUID. Next, imagine we've got a function that can >> specifically work with all classes that have a UUID. Proper OO teaches >> us to write an interface for this behaviour `Identifiable` or `HasUuid` >> or something alike. This interface would probably require its >> implementers to expose a `getUuid(): string` method. >> >> Without interfaces being able to define properties, we'll now have to >> implement a `getUuid()` method on all our 10 classes, nullifying the >> advantage we got from using `public readonly string $uuid` in the first >> place. If, on the other hand, this functionality was supported, we >> could write our interface like so, and wouldn't have to worry about any >> more boilerplate code: >> >> ``` >> interface HasUuid >> { >> public readonly string $uuid; >> } >> ``` >> >> With the addition of readonly properties, now seems like a good time to >> discuss changing these rules. I realise these questions touch the core >> ideas of OO, so I reckon some people might have another opinion and I'd >> like to hear your thoughts. >> >> To give you some more reading material, there is a precedent for >> interface properties in other languages: >> >> - TypeScript supports them [1] >> - C# supports them, albeit using property accessors [2] >> - Swift supports them via Protocols [3] >> >> Looking forward to hearing your thoughts. >> >> Kind regards >> Brent >> >> [1] >> https://www.typescriptlang.org/docs/handbook/type-compatibility.html >> <https://www.typescriptlang.org/docs/handbook/type-compatibility.html >> <https://www.typescriptlang.org/docs/handbook/type-compatibility.html>> >> [2] >> https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/interface-properties >> >> <https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/interface-properties> >> >> <https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/interface-properties >> >> <https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/interface-properties>> >> >> [3] https://docs.swift.org/swift-book/LanguageGuide/Protocols.html >> <https://docs.swift.org/swift-book/LanguageGuide/Protocols.html> >> <https://docs.swift.org/swift-book/LanguageGuide/Protocols.html >> <https://docs.swift.org/swift-book/LanguageGuide/Protocols.html>> > > The property accessor RFC (which didn't get to a vote) discussed this, and > specifically proposed making properties part of the interface for... > basically all the reasons given here. >
I thought the RFC didn't go to vote because Nikita didn't feel like it warranted the complexity: > This RFC overlaps with the Property Accessors RFC. In particular, it > implements the “only implicit get” aspect, though not with the exact same > semantics. As mentioned in the RFC, I'm not convinced that the full > complexity of accessors is truly warranted. Supporting readonly properties > and asymmetric visibility would cover a significant portion of the use-cases, > at a lower language complexity cost. [1] Is there any reason to assume property accessors will be reconsidered for 8.2? [1] https://wiki.php.net/rfc/readonly_properties_v2#rationale Kind regards Brent > My preference would be to add property accessors in 8.2 (at least the > asymmetric visibility part), and then redefine `readonly` properties as a > shorthand for a "get only" implicit accessor property; which, if I recall > correctly, is essentially the same semantics as `readonly`. (I didn't check > the RFC; I'm going by memory here.) That would include interface properties > by nature. > > --Larry Garfield > > -- > PHP Internals - PHP Runtime Development Mailing List > To unsubscribe, visit: https://www.php.net/unsub.php > <https://www.php.net/unsub.php>