Использование пространств имен: переход к глобальной функции/константе
(PHP 5 >= 5.3.0, PHP 7)
Внутри пространства имен, когда PHP встречает неполное имя класса, функции или константы, он преобразует эти имена с разными приоритетами. Имена классов всегда преобразуются к текущему имени пространства имен. Таким образом, чтобы получить доступ ко внутреннему классу или пользовательскому классу вне пространства имен, необходимо ссылаться по их абсолютному имени. Например:
Пример #1 Доступ к глобальным классам внутри пространства имен
<?php
namespace A\B\C;
class Exception extends \Exception {}
$a = new Exception('hi'); // $a - это объект класса A\B\C\Exception
$b = new \Exception('hi'); // $b - это объект класса Exception
$c = new ArrayObject; // фатальная ошибка, класс A\B\C\ArrayObject не найден
?>
Для функций и констант, PHP будет прибегать к глобальным функциям или константам, если функция или константа не существует в пространстве имен.
Пример #2 Необходимость прибегнуть к глобальным функциям/константам внутри пространства имен
<?php
namespace A\B\C;
const E_ERROR = 45;
function strlen($str)
{
return \strlen($str) - 1;
}
echo E_ERROR, "\n"; // выводит "45"
echo INI_ALL, "\n"; // выводит "7" - прибегнет к глобальной INI_ALL
echo strlen('hi'), "\n"; // выводит "1"
if (is_array('hi')) { // выводит строку "это не массив"
echo "это массив\n";
} else {
echo "это не массив\n";
}
?>
- Обзор пространств имен
- Определение пространств имен
- Определение подпространств имен
- Описание нескольких пространств имен в одном файле
- Использование пространства имен: основы
- Пространства имен и динамические особенности языка
- Ключевое слово namespace и константа __NAMESPACE__
- Использование пространств имен: импорт/создание псевдонима имени
- Глобальное пространство
- Использование пространств имен: переход к глобальной функции/константе
- Правила разрешения имен
- Часто задаваемые вопросы (FAQ): вещи, которые вам необходимо знать о пространствах имен
Коментарии
You can use the fallback policy to provide mocks for built-in functions like time(). You therefore have to call those functions unqualified:
<?php
namespace foo;
function time() {
return 1234;
}
assert (1234 == time());
?>
However there's a restriction that you have to define the mock function before the first usage in the tested class method. This is documented in Bug #68541.
You can find the mock library php-mock at GitHub.