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

Sin*_*uni 7 php oop namespaces

有时在一些库中,比如thephpleague/csv,我看到use关键字导入核心标识符(例如函数、类或常量),但我根本不明白为什么要导入它们。

请参见以下示例:

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;
Run Code Online (Sandbox Code Playgroud)

或者更多来自这里

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

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

yiv*_*ivi 7

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

这个想法是,通过避免全局名称查找并跳过后备规则,可以获得一些性能。

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

您可以阅读一些关于此的冗长且有趣的讨论:


dec*_*eze 3

当您位于 中时namespace,每个裸名称都引用该名称空间内的名称。IE:

namespace Foo;

echo bar();
Run Code Online (Sandbox Code Playgroud)

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

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

大多数情况下,PHP 内置名称可能没有必要,但项目作者可能只是将其作为规则来建立,以避免由于名称空间解析不明确而导致错误。