Wenn Sie eine Funktion in einem Namensraum zu definieren,Aufruf eine PHP-Funktion in einem anderen Namensraum definiert ohne das Präfix
namespace foo {
function bar() { echo "foo!\n"; }
class MyClass { }
}
Sie den Namespace angeben muß, wenn sie von einem anderen (oder global) Namespace Aufruf:
bar(); // call to undefined function \bar()
foo\bar(); // ok
Mit Klassen, die Sie einsetzen können, die „Verwendung“ Anweisung effektiv eine Klasse in den aktuellen Namensraum zu importieren [Edit:. Vielleicht haben Sie, um die Klassen zu bekommen „foo verwenden“ könnten, aber anscheinend nicht]
use foo\MyClass as MyClass;
new MyClass(); // ok, instantiates foo\MyClass
aber mit Funktionen funktioniert nicht [und wäre unhandlich gegeben, wie viele es sind]:
use foo\bar as bar;
bar(); // call to undefined function \bar()
Sie den Namespace Alias kann das Präfix kürzer zu machen, geben Sie
use foo as f; // more useful if "foo" were much longer or nested
f\bar(); // ok
Aber gibt es eine Möglichkeit, das Präfix vollständig zu entfernen?
Hintergrund: Ich arbeite an der Hamcrest-Matching-Bibliothek, die viele Factory-Funktionen definiert und viele von ihnen sind verschachtelt. Wenn das Namespace-Präfix verwendet wird, wird die Lesbarkeit der Ausdrücke wirklich aufgehoben. Vergleichen
assertThat($names,
is(anArray(
equalTo('Alice'),
startsWith('Bob'),
anything(),
hasLength(atLeast(12))
)));
zu
use Hamcrest as h;
h\assertThat($names,
h\is(h\anArray(
h\equalTo('Alice'),
h\startsWith('Bob'),
h\anything(),
h\hasLength(h\atLeast(12))
)));
Ich habe gerade den 5.6.0-dev auf Windows gebaut und es ausprobiert.Scheint gut zu funktionieren, obwohl Sie jede Funktion einzeln importieren müssen. – b01
Dies ist die richtige Antwort auf diese Frage. – user3640967