Cuando se define una función en un espacio de nombres,Llamar a una función de PHP se define en otro espacio de nombres sin el prefijo
namespace foo {
function bar() { echo "foo!\n"; }
class MyClass { }
}
debe especificar el espacio de nombres cuando se llama desde otro (o global) de espacio de nombres:
bar(); // call to undefined function \bar()
foo\bar(); // ok
con las clases que puede emplear la "utilización" declaración para importar de manera efectiva una clase en el espacio de nombres actual [Editar:. pensé que podría "utilizar foo" para obtener las clases, pero al parecer no]
use foo\MyClass as MyClass;
new MyClass(); // ok, instantiates foo\MyClass
pero esto no funciona con funciones [y sería difícil de manejar dado cuántos hay]:
use foo\bar as bar;
bar(); // call to undefined function \bar()
Puede crear un alias del espacio de nombres para hacer el prefijo más corto para escribir,
use foo as f; // more useful if "foo" were much longer or nested
f\bar(); // ok
, pero ¿hay alguna forma de eliminar el prefijo por completo?
Antecedentes: Estoy trabajando en la biblioteca de coincidencias de Hamcrest que define muchas funciones de fábrica, y muchas de ellas están diseñadas para ser anidadas. Tener el prefijo de espacio de nombres realmente mata la legibilidad de las expresiones. Comparo
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))
)));
Acabo de construir el 5.6.0-dev en Windows y lo probé.Parece funcionar bien, aunque debe importar cada función individualmente. – b01
Esta es la respuesta correcta a esta pregunta. – user3640967