【问题标题】:Why use the "use" keyword in PHP to import core identifiers?为什么要在 PHP 中使用“use”关键字来导入核心标识符?
【发布时间】:2021-10-12 09:13:01
【问题描述】:

有时在像 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;

或更多来自here

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

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

【问题讨论】:

    标签: php oop namespaces


    【解决方案1】:

    当您在namespace 中时,每个裸名都指的是该命名空间中的一个名称。即:

    namespace Foo;
    
    echo bar();
    

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

    如果名称在此命名空间中不存在,则有回退到全局名称的规则。如果您不想依赖这些规则,或者如果您确实实际上在您的命名空间中定义了这些名称,并且您不想不断地明确地写 \bar(),那就是当您可以明确地use 那些全局名称,以明确bar 指的是\bar 而不是Foo\bar

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

    【讨论】:

      【解决方案2】:

      这样做的目的是执行(微)性能优化,如here 所述。 (Archived link,以防万一)。

      这个想法是通过使用避免全局名称查找和跳过the fall-back rules,可以获得一些性能。

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

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

      【讨论】:

        猜你喜欢
        • 2010-11-07
        • 2017-09-24
        • 2015-11-09
        • 2013-10-14
        • 2011-10-02
        • 1970-01-01
        • 2015-05-19
        相关资源
        最近更新 更多