On Mon, Jun 24, 2024 at 10:22 PM Bilge <bi...@scriptfusion.com> wrote:
>
> On 24/06/2024 09:27, Claude Pache wrote:
>
> Hi,
>
> Hi Claude! I really appreciate your feedback. Everything you highlighted is 
> an important point that will be included in the RFC!
>
> A general remark: I appreciate that a static class does not impose arbitrary 
> restrictions (like: implicitly `final`) on the class beyond what is 
> meaningful for staticness. On the other side, I don’t think that we should 
> support markers that are technically possible, but semantically meaningless, 
> like the `readonly` marker on class.
>
> Great point, `readonly` and `static` should be mutually exclusive and 
> generate a compile-time error, since `readonly static` properties are not 
> supported.
>
> Some more specific remarks:
>
> * In the intro: “A static class is a class whose members (properties and 
> methods) are all static”. One of the most important point is missing, namely: 
> It is meaningless for a static class to have instances.
>
> I thought that was covered off, but I'll see if I can word it better.
>
> * In the “Proposal” section, it should be stated explicitly that any attempt 
> to construct an instance, not only with `new`, but also with any of the 
> `ReflectionClass::newInstance*()` methods, or with `unserialize()`, or with 
> whatever other mean, shall fail.
>
> Great point, I'll include that detail. I think we're also missing a similar 
> detail with respect to dynamic properties, which should of course also be 
> forbidden.
>
> Should a static class be marked `readonly` or `abstract`? I think not, 
> because those have no real semantic meaning for static class; their effects 
> on static members are only consequences of their intended meaning on 
> non-static class:
>
> * Unless/until the `readonly` marker may be applied to static properties, the 
> only effect of such a keyword, is that it would prevent the creation of 
> static properties. I don’t know if that restriction is useful, but in case it 
> would be used for that purpose, it would be hijacking the `readonly` marker 
> for a something it wasn’t intended for.
>
> Agree, as above, we'll make them mutually exclusive.
>
> * The main purpose of the `abstract` keyword is to prevent a class to be 
> instantiated, which (in case of static class) is more semantically described 
> by the `static` marker. Beyond that, it just allows to declare a method that, 
> if implemented by a subclass, should have a compatible signature. Most 
> notably, it does not prevent the other static members of the class to be used 
> directly.
>
> I tend to find inheritance is not a very useful concept in static contexts, 
> but others have already pointed out that some have found uses for it. Due to 
> my lack of experience I cannot confidently say that `abstract static` has no 
> value, but you make a compelling argument. Happy to add a similar mutual 
> exclusivity prohibition for this keyword too, unless and until someone 
> protests it with an equally compelling argument to the contrary.
>
> The RFC says that a static class may extend a class not explicitly marked as 
> static, but with no instance member. This is not sound, because a class with 
> no instance members is not necessarily static. The most obvious example is 
> `stdClass` (which has no member at all, even if their instances may have 
> properties).
>
> Do you mean it is not simply sufficient for a class to be regarded as 
> implicitly static by virtue of the fact that it has no instance members? I'm 
> not sure I agree, but I may be missing something. If we extend `stdClass` 
> then we gain nothing, and our class so extending it can still be safely 
> marked static, can it not? Please elaborate so I might understand better.
>
> Kind regards,
> Bilge

Hey Bilge,

> Do you mean it is not simply sufficient for a class to be regarded as 
> implicitly static by virtue of the fact that it has no instance members? I'm 
> not sure I agree, but I may be missing something. If we extend `stdClass` 
> then we gain nothing, and our class so extending it can still be safely 
> marked static, can it not? Please elaborate so I might understand better.

I think it is sound in theory, but in practice, it will be a foot gun.
Imagine if you were to take my HTTP code library and make something
static from it. Later, I added an instance member. Now, when you
upgrade, everything starts crashing because of one little change
unrelated to your code.

Reply via email to