Every time function autoloading been brought up in the past, there
have been concerns about performance issues when calling a global
function from inside a namespace. E.g. calling strlen
in a loop
would become far slower if every call has to trigger the autoloader.
But isn't it extremely rare to override global functions in a
namespace? And even if they are overridden, how common is it to call
an overridden function in the same namespace that exists in a
different file?
Would it be possible to handle this rare case with a per-file option
like declare(root_fallback=0);
?
Consider the following code examples:
example_1.php
namespace Foo;
echo strlen('test');
// PHP would first check if Foo\strlen exists. If not, it would check
// whether \strlen exists. Since it does, it would call the built-in
// function as expected without triggering the autoloader.
example_2.php
namespace Foo;
function strlen(string $str) {...}
echo strlen('test');
// PHP would first check if Foo\strlen exists. Since it is defined in
// the same file, it would be called without falling back to the
// global function or triggering the autoloader.
example_3.php
namespace Foo;
use function Bar\strlen;
echo strlen('test');
// PHP would first check if Bar\strlen exists. If not, it would
// trigger the autoloader rather than falling back to the global
// function. The same thing would occur for any qualified function
// call. E.g. without "use function" the following could be written:
echo \Bar\strlen('test');
example_4.php
namespace Foo;
echo my_function('test');
// PHP would first check if Foo\my_function exists. If not, it would
// check whether \my_function exists. If not, the autoloader would be
// triggered.
example_5.php
declare(root_fallback=0);
namespace Foo;
echo strlen('test');
// PHP would first check if Foo\strlen exists. If not, it would
// trigger the autoloader rather than falling back to the global
// function, since root fallback is disabled in the file.
What are your thoughts about this approach?
Personally I would rarely have to disable root fallback, since I like
to group functions in a single file per namespace. But it seems like
this would be a good way to enable function autoloading that works
with namespaces spread across multiple files and doesn't slow down
performance.