Когда Вы определяете функцию в пространстве имен,
namespace foo {
function bar() { echo "foo!\n"; }
class MyClass { }
}
необходимо указать пространство имен при назывании его от другого (или глобальный) пространством имен:
bar(); // call to undefined function \bar()
foo\bar(); // ok
С классами можно использовать оператор "использования" для эффективного импорта класса в текущее пространство имен [Редактирование: Я думал, что Вы могли "использовать нечто" для получения классов, но по-видимому нет.]
use foo\MyClass as MyClass;
new MyClass(); // ok, instantiates foo\MyClass
но это не работает с функциями [и было бы громоздкое данный, сколько существует]:
use foo\bar as bar;
bar(); // call to undefined function \bar()
Можно исказить пространство имен для создания префикса короче для ввода,
use foo as f; // more useful if "foo" were much longer or nested
f\bar(); // ok
но есть ли какой-либо способ удалить префикс полностью?
Фон: я работаю над библиотекой соответствия Hamcrest, которая определяет много функций фабрики, и многие из них разработаны, чтобы быть вложенными. Наличие префикса пространства имен действительно уничтожает удобочитаемость выражений. Выдержать сравнение
assertThat($names,
is(anArray(
equalTo('Alice'),
startsWith('Bob'),
anything(),
hasLength(atLeast(12))
)));
кому:
use Hamcrest as h;
h\assertThat($names,
h\is(h\anArray(
h\equalTo('Alice'),
h\startsWith('Bob'),
h\anything(),
h\hasLength(h\atLeast(12))
)));
Я не знаю элегантного решения, но ...
Вы можете создавать функции-оболочки, которые инкапсулируют функции во внешнем пространстве имен. Это позволит вам сохранить читабельность кода ...
function assertThat ($ x, $ y) {return h \ assertThat ($ x, $ y); }