Re: function autoloading v4 RFC
| From: | Rob Landers | Date: | Mon, 19 Aug 2024 16:23:27 +0000 |
| Subject: | Re: function autoloading v4 RFC | ||
| References: | 1 2 | Groups: | php.internals |
| Request: | Send a blank email to internals+get-125048@lists.php.net to get a copy of this message | ||
On Mon, Aug 19, 2024, at 14:03, Gina P. Banyard wrote:
> On Thursday, 15 August 2024 at 17:22, Rob Landers <rob@bottled.codes> wrote:
>> Hello internals,
>>
>> I've decided to attempt an RFC for function autoloading. After reading hundreds of
>> ancient (and recent) emails relating to the topic along with several abandoned RFCs from the past,
>> and after much review, I've decided to put forth a variation of a previous RFC, as it seemed
>> the least ambitious and the most likely to work:
>>
>> https://wiki.php.net/rfc/function_autoloading4
>>
>> Please let me know what you think. An implementation should be along before opening it for
>> a vote (now that I realize how important that is).
>
> I had a quick glance at the RFC, and I really don't think this is a good approach or good
> API.
> Having autoloading in SPL causes dumb issues, for example ext/session must register it has a
> dependency on ext/spl just for the autoloader. [1]
> This means that currently ext/session depends on ext/spl, ext/spl depends on ext/standard, and
> ext/standard depends on ext/session, a glorious circular dependency.
>
> This main problem has pushed me again to rebase my PR [2] for the Core Autoloading RFC. [3]
> The wording of the RFC hasn't been updated, as this is frankly my least favourite part of
> any RFC.
> The PR passes CI and has also produced benchmark results from CI. [4]
>
> I would rather have some collaboration on a proper solution than, IMHO, this suboptimal
> solution.
> I still need to get opinions from other people if it makes sense to remove the
> zend_autoload_class function pointer API and have the VM directly call zend_autoload.
> Because from what I remember 2 years ago, some profiling tools hook into it to track
> autoloading time.
> This might be improved by introducing new observer hooks.
>
>
> Best regards,
>
> Gina P. Banyard
>>
>
> [1]
> https://github.com/php/php-src/pull/14544#issuecomment-2294907817
> [2] https://github.com/php/php-src/pull/8294
> [3] https://wiki.php.net/rfc/core-autoloading
> [4] https://github.com/php/php-src/actions/runs/10441267948
>
Hey Gina,
I’d love to collaborate on this feature. For what it’s worth though, I did a ton of research on
it (mostly reading every discussion I could find on the topic, and prior RFCs) and I felt that this
API was the most likely to be accepted. You even have a comment on your PR asking why not an API
similar to this one (!) though your reasoning is sound for why it is a bad idea, and I believe it is
the superior API.
There are some key differences between our two RFC’s that I think are worth discussing (besides
the obvious API differences):
1. in your RFC, it calls the autoloader with the global function it isn’t found in both scopes.
In mine, it calls it once not found in the local scope and calls the autoloader once (for the local
scope). This seemed to be a highly liked proposal in one of the older discussions (2013-ish?) that
appeared to not result in a new RFC, as it would bypass a lot of perceived performance issues in
earlier RFCs. If an autoloader so desires, the autoloader can check the global scope (by getting the
“base name” of the function), but autoloading the global scope should be a niche application
these days.
2. I like the “pinning” aspect. I haven’t seen your code yet, but I suspect it just registers
the global function in the current namespace? If so, does this affect the __namespace__ global?
Probably not, but I am just curious. What happens if I manually require a file with a pinned
function in it?
3. Should we update function_exists like I did in mine to include an autoload argument?
4. You mention no default autoloader for classes and functions, while I agree that this should be
the case, will the spl library still provide the default class autoloader that can be registered?
As far as performance for ambiguous functions go, I was thinking of submitting an RFC, where
ambiguous function calls are tagged during compilation and always resolve lexically, sorta like how
it works now:
echo strlen($x); // resolves to global, always
require_once "my-strlen";
echo strlen($x); // resolves to my strlen, always
This works by basically rewriting the function name once resolved and may make the code more
predictable. If I can pull it off, it can be relegated to a technical change that doesn’t need an
RFC. Still working on it.
In other words, maybe pinning could be solved more generally in a future RFC, decrease your RFC’s
scope and chance for sharp edge cases.
In any case, if you are up for a high bandwidth conversation to collaborate, we can join a call,
collaborate in the open, or whatever you feel most comfortable with. I’m very excited to see this
feature.
— Rob