Зачем использовать ключевое слово «использовать» в PHP для импорта основных идентификаторов?

avatar
sina_md5
8 августа 2021 в 08:40
180
2
2

Иногда в некоторых библиотеках, таких как 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;

Или больше из здесь.

Эти классы, функции и константы, импортированные в этот файл, принадлежат ядру PHP, поэтому нам не нужно их импортировать.

Почему эта и другие библиотеки импортируют их?

Источник

Ответы (2)

avatar
yivi
10 августа 2021 в 10:40
3

Целью этого является выполнение (микро) оптимизации производительности, как описано здесь. (Архивная ссылка, на всякий случай).

Идея заключается в том, что, избегая поиска глобального имени и пропуская правила отката, можно повысить производительность.

Обратите внимание, что при любой реальной рабочей нагрузке эти преимущества незначительны и несущественны, и в большинстве случаев они становятся несущественными из-за кэширования кода операции. Тем не менее, прирост производительности, каким бы незначительным он ни был, существует.

Вы можете прочитать длинную и интересную дискуссию по этому поводу:

avatar
deceze
8 августа 2021 в 08:47
3

Когда вы находитесь в namespace, каждое пустое имя ссылается на имя в этом пространстве имен. То есть:

namespace Foo;

echo bar();

bar здесь действительно означает Foo\bar.

Существуют правила отката к глобальным именам, если имя не существует в этом пространстве имен. Если вы не хотите полагаться на эти правила, или если вы делаете на самом деле эти имена определены в вашем пространстве имен, и вы не хотите постоянно писать \bar() явно, тогда вы можете явно use эти глобальные имена, чтобы было однозначно, что bar относится к \bar, а не Foo\bar.

Вероятно, в большинстве случаев это не обязательно для встроенных имен PHP, но, возможно, автор проекта просто установил это, как правило, чтобы избежать ошибок из-за неоднозначности разрешения пространства имен.