Re: Two-step creation for PHP modules
| From: | Larry Garfield | Date: | Tue, 09 Jun 2026 22:24:25 +0000 |
| Subject: | Re: Two-step creation for PHP modules | ||
| References: | 1 2 3 4 | Groups: | php.internals |
| Request: | Send a blank email to internals+get-131190@lists.php.net to get a copy of this message | ||
On Tue, Jun 9, 2026, at 11:39 AM, Alex Rock wrote:
>> First, what is the problem you want to solve?
>
> The main problems that PHP modules solve are the following:
>
> - Libraries can finally isolate code completely, and not only in
> private class methods, but they can isolate entire structures, and can
> even isolate a sub-library
> - Since all modules internally contain a hashed-prefix version of all
> their definitions, two versions of the same library can coexist, since
> a module hash is unique based on its file path and contents (I should
> have made it explicit that the module prefix is hashed based on file
> contents & path, to ensure uniqueness)
>
> Many existing libraries could migrate parts of their internal
> structures (the ones not supposed to be supported by their BC policy)
> to modules with no impact on userland code.
See, I don't think this is remotely true.
Consider Serde. (My go-to example.) It contains dozens of class-likes. A typical serialization
request is going to use 90% of them. Being able to front-load and link all of them without going
through the autoloader every time sounds good! But...
There is no way in hell that I'm moving dozens of classes into a single file.
Multi-thousand-line files are frowned upon for a reason. In practice I don't really need most
of them to be private. Maybe one, I dunno. So I simply wouldn't bother., meaning I
wouldn't benefit from whatever performance optimizations we are able to add later.
So this approach makes modules something usable ONLY by code bases that have lots of defined
class-likes or functions that are "private", AND they're all very very small so that
the resulting mega-file isn't too large for my IDE to open. That's a very, very small
number of cases.
I will reiterate what Rowan said above, and what I said the last time modules were discussed: module
== file is absolutely a dead-end for PHP. It simply will not work in practice. Not because of
PSR-4 like some people keep claiming, but because the resulting files would be just too damned big
and unwieldy.
Add to that, how do I write tests for the "private" classes? I should still be able to
test those on their own, without having to go through the few public facing classes. If the tests
are in a separate file... how do I do that?
Let's stop trying to make module == file happen. It's not going to happen.
--Larry Garfield