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