Quando si definisce una funzione in uno spazio dei nomi,Chiamata di una funzione PHP definita in un altro spazio dei nomi senza il prefisso
namespace foo {
function bar() { echo "foo!\n"; }
class MyClass { }
}
è necessario specificare lo spazio dei nomi quando si chiama da un altro (o globale) dello spazio dei nomi:
bar(); // call to undefined function \bar()
foo\bar(); // ok
Con le classi si possono utilizzare l ' "utilizzazione" dichiarazione per importare in modo efficace una classe nel namespace corrente [Edit:. ho pensato che si potrebbe "usare foo" per ottenere le classi, ma a quanto pare non]
use foo\MyClass as MyClass;
new MyClass(); // ok, instantiates foo\MyClass
, ma questo non funziona con le funzioni [e sarebbe ingombrante dato quanti ce ne sono]:
use foo\bar as bar;
bar(); // call to undefined function \bar()
È possibile alias lo spazio dei nomi per rendere il prefisso più breve per digitare,
use foo as f; // more useful if "foo" were much longer or nested
f\bar(); // ok
ma esiste un modo per rimuovere completamente il prefisso?
Sfondo: sto lavorando alla libreria di corrispondenza di Hamcrest che definisce molte funzioni di fabbrica e molte sono progettate per essere annidate. Avere il prefisso namespace uccide davvero la leggibilità delle espressioni. Paragono
assertThat($names,
is(anArray(
equalTo('Alice'),
startsWith('Bob'),
anything(),
hasLength(atLeast(12))
)));
a
use Hamcrest as h;
h\assertThat($names,
h\is(h\anArray(
h\equalTo('Alice'),
h\startsWith('Bob'),
h\anything(),
h\hasLength(h\atLeast(12))
)));
Ho appena installato il 5.6.0-dev su Windows e l'ho provato.Sembra funzionare bene, anche se devi importare ciascuna funzione individualmente. – b01
Questa è la risposta corretta a questa domanda. – user3640967