Когда вы определяете функцию в пространстве имен,
namespace foo {
function bar() { echo "foo!\n"; }
class MyClass { }
}
вы должны указать пространство имен при вызове его из другого (или глобального) пространства имен:
bar(); // call to undefined function \bar()
foo\bar(); // ok
С помощью классов вы можете использовать инструкцию "use" для эффективного импорта класса в текущее пространство имен [Edit: Я думал, что вы можете "использовать foo" для получения классов, но, по-видимому, нет.]
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, которая определяет множество функций factory, и многие из них предназначены для вложенности. Наличие префикса пространства имен действительно убивает читаемость выражений. Сравнить
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))
)));