我一直在阅读PHP中的Using namespaces: Aliasing/Importing。有两件事我不明白。
它说,
请注意,对于命名空间名称(完全限定的命名空间名称) 包含名称空间分隔符,例如Foo \ Bar而不是全局 没有的名称,如FooBar),领先的反斜杠是 不必要且不推荐,因为导入名称必须完整 限定,并且不会相对于当前命名空间进行处理。
有人可以解释一下
答案 0 :(得分:5)
它实际上意味着它在example中所说和所显示的内容。导入命名空间类时,应省略第一个反斜杠:
use My\Full\Classname as Another; // recommended
use \My\Full\Classname as Another; // not recommended
原因是use
期望fully qualified namespace。您不能使用相对路径。换句话说,如果您已经在My\
命名空间中,则不能use Full\Classname
。
实际上在the first chapter中对此进行了解释:
在PHP世界中,命名空间旨在解决库和应用程序的作者在创建可重用的代码元素(如类或函数)时遇到的两个问题:
- 您创建的代码与内部PHP类/函数/常量或第三方类/函数/常量之间的名称冲突。
- 能够别名(或缩短)Extra_Long_Names,旨在缓解第一个问题,提高源代码的可读性。
因此,目的是缩短和/或避免冲突,例如当你有两个名为Foo的类并且需要同时使用它们时,你必须有办法解决这个冲突(至少如果你不想每次都使用完全限定的名字):
use My\Very\Long\Namespaced\Class\Named\Foo as Foo;
use My\Other\Foo as OtherFoo;
然后你可以使用
$foo = new Foo;
$otherFoo = new OtherFoo;
这样简短而且不会发生冲突。真的没有更多的东西。
答案 1 :(得分:4)
您可能需要导入两个完全独立的名称空间,这些名称空间碰巧具有相同的名称。比如,也许您需要从mysql中选择数据然后插入到oracle中,并且您正在使用一些使用命名空间的数据库库。
use Database\Mysql\Connection;
use Database\Oracle\Connection;
$conn = new Connection(); //which one is it??
您可以跳过导入命名空间
use Database\Mysql\Connection;
use Database\Oracle\Connection;
$conn = new Database\Mysql\Connection();
或至少其中一个别名
use Database\Mysql\Connection as MysqlConnection;
use Database\Oracle\Connection as OracleConnection;
$conn = new MysqlConnection();