On Tue, Jul 7, 2026 at 4:50 PM Alex Rock <[email protected]> wrote:

> Le 07/07/2026 à 05:06, Michael Morris a écrit :
>
>
>
> I'm not sure that I like the current shift of the first ideas you exposed.
>
> At first, it was about adding an internal hook when encountering a
> "namespace" statement. Something that could be used to setup libraries
> *after* autoload, for instance.
>

At first it was a function to hook into the namespace keyword and fire code
that would initialize the newly declared namespace. However, namespaces
also get declared when a new class is loaded. The namespace init logic
would still end up firing - when the class def file is loaded it's going to
have a namespace keyword.  So this can be be accomplished with just that
function - but it occured to me that it's actually highly unlikely that a
dev will want to do this without also taking autoloading into account. So
it makes sense to unify the handlers.


>
> Here, your new draft suggests an update to the "use" statement, which
> currently has absolutely zero impact, and doesn't trigger autoload at
> all.


And you've misread the proposal entirely.  Use statements still do nothing
under this proposal.


> Plus, it would trigger in two different ways, depending on whether
> the final symbol exists in the symbols table or not, and triggering
> another call with the namespace as argument.
>
>
Again, no, that's not how it works at all.  I'll repeat the example

```
namespace Acme\Foo\Widgets;
```

The autoloaders may be called after this line.  Supplied callbacks with 2
arguments will receive (null, "Acme\Foo\Widgets"). Supplied callbacks
expecting 1 argument will NOT BE CALLED, as they are presumed to be of the
older form and are only able to load classes, and that's not what's
happening here.

```
use Omnicorp\Bar\Helpers;
```

Nothing happens on this line currently, or under the RFC.

```
$controller = new Controller();
```

The engine will look for Acme\Foo\Widgets\Controller. If it doesn't find it
autoloaders are invoked. Autoloaders that expect 1 argument will receive
"Acme\Foo\Widgets\Controller". Autoloaders expecting 2 arguments will
receive ("Acme\Foo\Widgets\Controller", null). Why null? Because the
namespace declaration at the beginning of the file already tripped off
namespace initialization and it should not need to run again.

```
$name = make_widget_name();
```

The engine will try to call Acme\Foo\Widgets\make_widget_name, and on
failure will try \make_widget_name, and if that fails a fatal error is
raised.  This function can be defined by the namespace initialization code
gets called with the namespace statement.

```
echo strlen($name);
```

The engine will try to call Acme\Foo\Widgets\strlen() and on failure will
call \strlen() which is always available.

```
Helpers\spin_wheels();
```

The use statement above silently rewrites this line as
Omnicorp\Bar\Helpers, and now at this line Omnicorp\Bar\Helpers\spin_wheels
is called. If it fails, since "Omnicorp\Bar\Helpers" is not in the list of
initialized namespaces the engine will call autoloaders expecting 2
arguments only with argument (null, "Omnicorp\Bar\Helpers"). After these
callbacks run, Omnicorp\Bar\Helpers\spin_wheels() will be retried. If it
fails \spin_wheels() will be tried, and a fatal error raises if the symbol
still does not resolve.

I will not address the rest of your reply as it is responding to a
misunderstanding of how the RFC works.

Reply via email to