On Thu, Apr 23, 2020 at 6:59 PM Nicolas Grekas <nicolas.gre...@gmail.com>
wrote:

> Hello,
>
> with preloading and Composer, we don't need anymore to consider autoloading
> for functions and/or constants. The reason is that basically Composer is
> already doing a great job at loading functions: just give it a list of
> files and it will ensure they are included all the time. Actually, Composer
> is just an example, all similar "require all the time" strategies work.
>
> The drawback of this approach used to be that requiring a bunch of
> (potentially unused) files could be costly. But now that we have
> preloading, this cost is zero. As such, autoloading functions/constants
> would serve no purpose.
>
> Then, we periodically have discussions about the rules for namespace
> resolution of functions/constants. The fallback-to-root-namespace has no
> measurable performance overhead - the cache is very effective. Yet, Nikita
> has stated a few times that knowing the type of the arguments of the
> function being called helps the engine a bit. With JIT, this might be
> (/become) more important (is that correct, Dmitry and/or Nikita?)
>
> I'm thus wondering: could we resolve the fallback-to-root-namespace rule at
> preload time, for all preloaded implementations? For runtime-loaded code,
> we would keep the current behavior.
>
> In practice, this means that during development (when preloading is not
> used), we would preserve all the hackability that the rule provides (PHP
> being a hackable engine is a big PRO, here, this can help e.g. testing a
> lot). The fallback-to-root-namespace is a wise pragmatic rule that serves
> the language well IMHO. But in prod, in full-perf mode (aka when preloading
> is enabled), this proposal would pave the way for better performance with
> JIT, if confirmed.
>
> WDYT?
>
> Nicolas
>
> PS: I fear I would be unable to implement anything related to this proposal
> so I'm just sharing the idea to see if it could be interesting.
>

Hey Nicolas,

I think this is something we should consider. Maybe not as default
behavior, but at least under an ini setting. Basically, any unqualified
call would get resolved to a global call or a namespaced call based on
which functions are declarated at preloading time.

I see one potential problem. If you have something like

namespace Foo;
if (true) {
    function strlen($x) {}
}
strlen("foo");

then depending on how the preloading is performed, PHP will not be aware of
the "Foo\strlen" function. Specifically if opcache_compile_file()
preloading is used, because it does not execute code. If "require" based
preloading is used, this is not a problem.

Regards,
Nikita

Reply via email to