BackSlash(\),PHP中命名空间别名的命名空间分隔符

时间:2013-07-19 04:14:45

标签: php namespaces alias

我一直在阅读PHP中的Using namespaces: Aliasing/Importing。有两件事我不明白。

它说,

  

请注意,对于命名空间名称(完全限定的命名空间名称)   包含名称空间分隔符,例如Foo \ Bar而不是全局   没有的名称,如FooBar),领先的反斜杠是   不必要且不推荐,因为导入名称必须完整   限定,并且不会相对于当前命名空间进行处理。

有人可以解释一下

  • 这是什么意思?
  • 使用命名空间别名的目的是什么?鉴于我知道使用命名空间的目的。

2 个答案:

答案 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();