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
```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
```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
```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
```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
```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.
--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to