我一直在阅读有关使用命名空间:PHP 中的别名/导入。有两点我不明白。
它说,
请注意,对于命名空间名称(包含命名空间分隔符的完全限定的命名空间名称,例如 Foo\Bar 而不是不包含命名空间分隔符的全局名称,例如 FooBar),前导反斜杠是不必要的,也不推荐使用,因为导入名称必须是完全限定的,并且不相对于当前命名空间进行处理。
有人可以解释一下吗
- 这是什么意思?
- 使用命名空间别名的目的是什么?鉴于我知道使用命名空间的目的。
我一直在阅读有关使用命名空间:PHP 中的别名/导入。有两点我不明白。
它说,
请注意,对于命名空间名称(包含命名空间分隔符的完全限定的命名空间名称,例如 Foo\Bar 而不是不包含命名空间分隔符的全局名称,例如 FooBar),前导反斜杠是不必要的,也不推荐使用,因为导入名称必须是完全限定的,并且不相对于当前命名空间进行处理。
有人可以解释一下吗
它确实意味着它在示例中所说和显示的内容。导入命名空间类时,应省略第一个反斜杠:
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;
所以这很简短,不会发生冲突。真的没有更多的东西了。
您可能需要导入两个完全独立的名称空间,它们恰好具有相同的名称。就像,也许您需要从 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();