BackSlash(\),PHP 中命名空间别名中的命名空间分隔符
Posted
技术标签:
【中文标题】BackSlash(\\),PHP 中命名空间别名中的命名空间分隔符【英文标题】:BackSlash(\), Namespace Separator in namespaces aliasing in PHPBackSlash(\),PHP 中命名空间别名中的命名空间分隔符 【发布时间】:2013-07-18 06:17:49 【问题描述】:我一直在阅读 php 中的 Using namespaces: Aliasing/Importing。有两点我不明白。
它说,
请注意,对于命名空间名称(完全限定的命名空间名称 包含命名空间分隔符,例如 Foo\Bar 而不是全局 没有的名称,例如 FooBar),前导反斜杠是 不必要且不推荐,因为导入名称必须完全 限定,并且不相对于当前命名空间进行处理。
谁能解释一下
这是什么意思? 使用命名空间别名的目的是什么?鉴于我知道使用命名空间的目的。【问题讨论】:
另见What are namespaces 和What is a namespace and how is it implemented in PHP。我不会因为您要求对手册的特定部分进行澄清而将您关闭,因为您要求对手册的特定部分进行澄清,但是如果您以某种方式提到您之前检查过这些,我将不胜感激(您做过,对吗?)。 是的,我做到了。感谢您的支持顺便说一句 【参考方案1】:什么意思?
这真的意味着它在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;
所以这很简短,不会冲突。真的没有更多的了。
【讨论】:
【参考方案2】:您可能需要导入两个完全独立的名称空间,它们恰好具有相同的名称。比如,也许你需要从 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();
【讨论】:
以上是关于BackSlash(\),PHP 中命名空间别名中的命名空间分隔符的主要内容,如果未能解决你的问题,请参考以下文章