Вызов функции, определяемой PHP в другом пространстве имен без префикса

Когда Вы определяете функцию в пространстве имен,

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))
    )));
29
задан David Harkness 28 July 2010 в 23:05
поделиться

1 ответ

Я не знаю элегантного решения, но ...

Вы можете создавать функции-оболочки, которые инкапсулируют функции во внешнем пространстве имен. Это позволит вам сохранить читабельность кода ...

function assertThat ($ x, $ y) {return h \ assertThat ($ x, $ y); }

1
ответ дан 28 November 2019 в 01:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: