I proposed this previously and have a working implementation, though it may
need some updates. However, I chose not to pursue it further because it was
clear it wouldn't pass as many people here are unaware that PHP is a
multi-paradigm language.

I frequently use static classes because they allow me to have private
methods and constants within the class. With namespaced functions, there's
no way to declare functions private to the current scope; any function
declared in that namespace will be public unless I use a separate internal
namespace, which is impractical.

I also disagree with the idea that static classes imply global state. They
are primarily used for grouping functions.

Additionally, there's a general acceptance that we can't autoload functions
in PHP, and nothing is being done to address this issue. Yet, it is
considered impractical or a "Code Smell" to do one of the only things that
make sense.

This is a minor change that breaks nothing and would help many people, yet
no one is willing to raise any valid arguments against it.

On Sat, Jun 15, 2024 at 5:19 AM Bilge <bi...@scriptfusion.com> wrote:

> Hi Internals,
>
> I want to introduce the `static` keyword at the class declaration level.
> That is, the following would be valid: `static class Foo {}`.
>
> A "static class" is one that only permits static members
> (methods/properties) and could have similar semantics to a static class
> in C#
> <
> https://learn.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/static-classes-and-static-class-members>.
>
> In particular: static classes are implied final and they cannot inherit
> from any other class. These specific semantics are negotiable, but in
> practice I've never seen the need to mix inheritance with pure static
> classes.
>
> A static class can be emulated somewhat with a trait in userland, and I
> have long used such a micro library for this purpose
> <
> https://github.com/ScriptFUSION/StaticClass/blob/master/src/StaticClass.php>.
>
> This works by forcing the constructor to be private, thus preventing
> instantiation, but it cannot guarantee that the consumer does not create
> any instance methods anyway (just that such methods would be useless as
> they would be inaccessible). Ergo, it would be better to have this as a
> language feature so the compiler can provide the necessary guarantees
> and warnings against improper use.
>
> I am not too familiar with internals, but I figure I can probably muddle
> my way through an implementation by following the readonly PR
> <https://github.com/php/php-src/pull/7305/files>, which I imagine has
> similar touch points. The main thing I'd like to ascertain at this stage
> is whether such a PR would have support?
>
> Kind regards,
> Bilge
>

Reply via email to