1

我一直在阅读有关使用命名空间:PHP 中的别名/导入。有两点我不明白。

它说,

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

有人可以解释一下吗

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

2 回答 2

5

这是什么意思?

它确实意味着它在示例中所说和显示的内容。导入命名空间类时,应省略第一个反斜杠:

use My\Full\Classname as Another;    // recommended
use \My\Full\Classname as Another;   // not recommended

原因是use需要一个完全限定的命名空间。您不能使用相对路径。换句话说,如果您已经在My\命名空间中,则不能use Full\Classname.

目的是什么?

实际上在第一章中已经解释过:

在 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;

所以这很简短,不会发生冲突。真的没有更多的东西了。

于 2013-07-19T04:25:19.437 回答
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();
于 2013-07-19T04:38:33.063 回答