启动对象时类类型前的反斜杠[重复]

Posted

技术标签:

【中文标题】启动对象时类类型前的反斜杠[重复]【英文标题】:Backslash before class type when initiating an object [duplicate] 【发布时间】:2016-09-19 17:46:52 【问题描述】:

我看到很多代码在新对象的初始化中在类类型之前包含一个反斜杠:

db = new \PDO($dsn, $username, $password);

问题:

前面代码中反斜杠的作用是什么?

我的推论:

我经常在我的代码中使用不带反斜杠的db = new PDO(...) 来建立与 mysql 的连接,它对我来说效果很好,尽管我经常在其他用户的代码中看到反斜杠。乍一看,它似乎是在指定一个类的路径,尽管这对我来说似乎很奇怪,因为我通常在我的代码中使用正斜杠 / 作为路径,也因为我从未阅读或看到这是一个要求启动任何类类型的对象时。

考虑到代码在没有反斜杠的情况下对我有用,我对\ 的用途感到困惑。

我试图找到有关它的文档但没有成功 (http://php.net/manual/en/language.oop5.php),但我确定它就在那里。

【问题讨论】:

看看***.com/questions/19699319/… 可能也属于可能的重复项。 @Fred-ii- 如果它是重复的,您可以根据需要将其放置为一个。但是,我无法在那里找到我的具体答案。是的,用户对他的问题的解决方案是在使用命名空间时放置一个反斜杠,尽管我对反斜杠的目的感到困惑。过去我遇到过一些情况,我的代码不起作用,在放置反斜杠后它会神奇地工作,但我不明白为什么。 如果您在文件顶部有namespace,例如namespace myApp;,那么在代码中使用时任何不是专门为namespaced 的类都将获得获取当前命名空间'前置'它。所以,new PDO(); 会变成:new MyApp\PDO();,它不存在并且会失败。 'root' 命名空间被称为:'\'。所以你需要使用new \PDO();来防止命名空间自动完成。 是的,反斜杠 ('\') 用作命名空间路径分隔符。前面的 cmets 中提到的链接中都有解释。另外,也许很有趣? A Brief Introduction to PHP Namespacing。也有关于它的标准 - php-fig.org/psr/psr-4 天哪,这是一个伪造的副本。 whyPDO 这样的全局类或像 strlen 这样的全局函数需要设置为绝对路径 `\` 以得到认可。它不能解决全局和本地范围,也不能解决 manual 中未写的任何其他有用的问题 这个问题是合法的,并询问为什么必须使用反斜杠,而不是命名空间如何工作,OP 显然掌握了 80%理论。 【参考方案1】:

有时在框架控制器或模型(如 ZF2、Laravel)中使用反斜杠来指定您希望使用 PHP 原生类而不是框架类

【讨论】:

【参考方案2】:

据我了解,这与类声明在文件结构中的位置有关。如果您在自定义类的文件夹中工作,例如专用于留言簿的文件夹,并且您在留言簿文件夹中,您可能希望访问您经常使用的类,在许多情况下是像 PDO 或MySQLi。这些将存储在根目录中,因此您需要告诉 PHP 在哪里查找文件。

所以,假设您的文件结构类似于:

根 - 留言簿 - 论坛 - 存储物品

您正在处理 Store items 目录,但想要访问根目录中的 PDO 处理程序,因此您可以通过声明它来访问它: $conn = 新 \PDO;

同样,假设您在论坛部分并想从商店中提取信息,您只需像这样访问它: $item = 新的\Store\StoreItem;

至少……我认为是这样的!如果您正在使用本地声明的所有类,则无需过多担心目录结构。

【讨论】:

这与目录结构无关。这是关于命名空间嵌套的。

以上是关于启动对象时类类型前的反斜杠[重复]的主要内容,如果未能解决你的问题,请参考以下文章

为啥JSON字符串当中会出现反斜杠?

JS去除字符串众的反斜杠

在从laravel ajax返回的json中的每个斜杠中获取额外的反斜杠“\”

MySQL 中的反斜杠 \,真是太坑了!!

windows和linux的差异:c++中的反斜杠和正斜杠

正则表达式:向后看以避免奇数个连续的反斜杠