php[tek] 2018 : Call for Speakers

Использование пространств имен: переход к глобальной функции/константе

(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";
}
?>

add a note add a note

User Contributed Notes 1 note

up
9
markus at malkusch dot de
2 years ago
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.
To Top