> On Jul 11, 2024, at 8:14 PM, Bilge <[email protected]> wrote:
>
> On 25/06/2024 16:17, Derick Rethans wrote:
>> we shouldn't be encouraging static classes as
>> a bag of static functions, that ought to be just namespaced functions.
>>
>> cheers,
>> Derick
>>
> Can someone clue me in as to why grouping related functions in a file with
> nothing but a namespace is strictly better than those same related functions
> grouped as members of a class? It doesn't have to be Larry or Derick, because
> even though they have expressed this view, I am aware they are not the only
> ones whom hold it. Anyone who can shed some light on this perspective is
> welcome to comment.
I cannot answer your question as posed but I can give you a counter-reason, one
supporting the use of static classes as a bag of static functions, at least
with the feature set of PHP 8.4 and prior.
If a developer needs to hide global state — and there are valid reasons for
maintaining global state using static classes along with a related set of
static functions. Minimally, when using streams with include*()/require*() e.g.
include("myprotocol://${handle}") namespaces simply do not have the necessary
visibility scoping features and thus are not an option.
I am currently working on a PoC for packages in userland that uses static
classes exactly in this way. I will hopefully be able to share working code for
that soon.
-Mike
P.S. None of include*()/require*() accept a stream context AFAICT. If they did
a developer could pass in a dependency object as a context, but currently
(again, AFAICT) there is no way to associate a dependency object with an
include*()/require*() call. The only approach I have been able to identify to
allow access to retrieve and update a dependency object is to use a key into a
array in a private static property with public static get/set methods.
If context were added to include*()/require*() and/or visibility scoping where
added to symbols within namespaces then this use-case would no longer be an
argument for static classes. But unless and until then, static classes are the
only way to go. #fwiw