Re: [PHP-DEV] RFC Draft - Improved Autoloading

"Rowan Tommins [IMSoP]" <[email protected]> Sat, 18 Jul 2026 21:37:30 +0100
Newsgroups gmane.comp.php.devel
Message-ID <[email protected]>
On 07/07/2026 04:06, Michael Morris wrote:
> If a namespace chain is encountered only one call is made. Hence
>
> ```
> namespace A\B\C;
> ```
>
> Will result in a call to the autoloader of (null, "A\B\C").
>
> NOTE. The engine will mark namespaces "A" and "A\B" as seen in 
> addition to the specified namespace "A\B\C", so the autoloader needs 
> to work out if it should do anything for those namespaces as well.


Hi Michael,

I agree with others that adding an extra parameter to the class 
autoloader is probably more confusing than helpful. I think the same is 
true of this idea of "namespace chains" and marking multiple prefixes as 
"seen" at once.

Let's say I want to register an autoloader that loads a file 
'src/Acme/Frobulator/functions.php' containing functions in the 
namespace 'Acme\Frobulator'. In your current draft, I would have to 
register an autoloader that checked:

- that the namespace argument is not null
- that EITHER the namespace argument is exactly 'Acme\Frobulator' OR 
begins with 'Acme\Frobulator\' (I don't want to also match 
'Acme\FrobulatorNG')
- that I haven't already loaded the file - since calls will still happen 
for both 'Acme\Frobulator\Foo' and 'Acme\Frobulator\Bar'

Or maybe I want to automatically check for a relevant 'functions.php', 
so need to break down an argument of 'Acme\Frobulator\Foo' into a loop 
looking for 'src/Acme/functions.php' and 
'src/Acme/Frobulator/functions.php' 
and 'src/Acme/Frobulator/Foo/functions.php' - again, manually handling 
the fact that I'll get a call for 'Acme\Frobulator\Bar'.


All of that complexity can be completely avoided with a single-argument 
function, called with the exact namespace which is being seen for the 
first time. One name check for a specific namespace, or one file stat 
check for a specific file name.

If someone wants to match "any namespace starting Acme\", that looks 
exactly the same either way: check with str_starts_with, and account for 
multiple namespaces matching that prefix.


That function would be called:

1) When an undefined function or constant is encountered with a 
qualified name

2) At the top of any file or block using the "namespace" keyword (i.e. 
when that line is reached at run-time)

3) When an undefined class-like (class, trait, interface, enum) is 
encountered with a non-empty namespace prefix, either just before or 
just after the existing autoloader

Once the function has been called, the exact string it was given is 
added to an internal hashmap. Future events which would call with that 
exact string are skipped, unless a new callback has been registered.


Note that (2) and (3) cover different use cases: (2) covers unqualified 
function and constant calls, which need to be loaded early so that 
global fallback still works efficiently; (3) covers files with multiple 
class-likes, e.g. 'src/Acme/Frobulator/Options/enums.php' containing a 
bunch of enums in the 'Acme\Frobulator\Options' namespace.

As you point out, (2) is also a natural point for "namespace setup" 
behaviour, beyond just declaring symbols.


> This RFC will almost certainly trigger a related PSR standard that 
> takes namespace setup into account. Once that is settled the 
> maintainers of composer will likely implement such a standard.  One 
> possible route is to follow Python's lead of having a __setup__.php 
> file in the namespace's directory if the namespaces are set up in 
> mirror to the file system setup, but nothing in this RFC mandates that 
> approach.

I would imagine it less as a single "setup" file, and more as a 
convention for files with more than one symbol in - as in the above 
examples of 'src/Acme/Frobulator/functions.php' and 
'src/Acme/Frobulator/Options/enums.php'

Maybe even a prefix, like 'autoload_', so that 
'src/Acme/Frobulator/autoload_helpers.php', 
'src/Acme/Frobulator/autoload_shortcuts.php' and 
'src/Acme/Frobulator/autoload_mode_consts.php' all get picked up 
automatically.

As you say, not something the RFC needs to mandate, but examples can be 
useful to picture how a feature would play out in practice.

-- 
Rowan Tommins
[IMSoP]