为什么在 PHP 中使用 “use” 关键字来导入核心标识符?

Why use the "use" keyword in PHP to import core identifiers?

提问人:Sina Ghoshuni 提问时间:8/8/2021 最后编辑:yiviSina Ghoshuni 更新时间:8/16/2021 访问量:604

问:

有时在某些库中,例如 ,我看到了导入核心标识符(例如函数、类或常量)的关键字,但我根本无法理解为什么要导入它们。thephpleague/csvuse

请参阅以下示例:

use Generator;
use SplFileObject;
use function filter_var;
use function get_class;
use function mb_strlen;
use function rawurlencode;
use function sprintf;
use function str_replace;
use function str_split;
use function strcspn;
use function strlen;
use const FILTER_FLAG_STRIP_HIGH;
use const FILTER_FLAG_STRIP_LOW;
use const FILTER_SANITIZE_STRING;

或者从这里开始更多。

这个文件中导入的这些类、函数和常量属于 PHP 核心,所以我们实际上不需要导入它们。

为什么这个库和其他库会导入这些?

php oop 命名空间

评论


答:

3赞 deceze 8/8/2021 #1

当您处于 中时,每个裸名称都引用该命名空间中的一个名称。即:namespace

namespace Foo;

echo bar();

bar这里的真正意思是.Foo\bar

如果此命名空间中不存在全局名称,则有回退到全局名称的规则。如果您不想依赖这些规则,或者如果您确实在命名空间中定义了这些名称,并且您不想不断显式地编写这些名称,那么您可以显式地使用这些全局名称,以使其明确引用而不是引用。\bar()usebar\barFoo\bar

大多数时候,PHP内置名称可能不是必需的,但也许项目作者只是将其确定为规则,以避免由于命名空间解析歧义而导致的错误。

7赞 yivi 8/10/2021 #2

这样做的目的是执行(微)性能优化,如此所述。(存档链接,以防万一)。

这个想法是,通过使用避免全局名称查找和跳过回退规则,可以获得一些性能。

请注意,对于任何现实生活中的工作负载,这些收益都是可以忽略不计且无关紧要的,并且它们大多因操作码缓存而变得无关紧要。然而,性能提升是存在的,尽管它可能很小。

你可以阅读一些关于这个的冗长而有趣的讨论: