php Глобальные функции в пространстве имен. Как определяется имя функции без слеша

В учебнике Котерова написано следующее:

В файлах где объявлено пространство имен, для обращения к стандартным функциям, например к строковой функции strlen(), нам потребуется воспользоваться абсолютным именем \strlen(), чтобы сообщить php, что strlen() является функцией глобального пространства имен
, а не \php7

И тут же следует пример:

<?php
namespace PHP7;

function strlen($str)
{
    return count(str_split($str));
}

// Это php7\strlen
echo strlen("Hello world!") ."<br/>";
//Это стандартная функция strlen()
echo \strlen("Hello world!") ."<br/>";
?>

В этом коде меня смущает стандартная функция str_split(), которая почему-то написана без обратного слэша. Правильно ли я догадываюсь, что в этом случае срабатывает тот же принцип, что и в областях видимости в javaScript - то есть, если программа не находит объявления функции в этом пространстве имен, она поднимается на уровень выше и берет её уже оттуда?

vedro-compota's picture

Правильно ли я догадываюсь, что в этом случае срабатывает тот же принцип, что и в областях видимости в javaScript - то есть, если программа не находит объявления функции в этом пространстве имен, она поднимается на уровень выше и берет её уже оттуда?

В данном случае "подъём" (точнее его сильно урезанный аналог) происходит действительно только на один уровень выше (так как у вас только одна доп. секция к глобальному пространству -- лишь "php7"), но в общем случае "прыжок" происходит сразу в гловальное пространство:

если константа или функция ...не существует в текущем пространстве имен, используется глобальная константа или функция name, если она существует.

т.е. можно сказать, что в php вообще нет как такового подъёма (например для классов), а для функций есть сразу в глобальное пространство.

_____________
матфак вгу и остальная классика =)

Voronve's picture

Все понятно, спасибо )