启动对象时类类型前的反斜杠[重复]
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
天哪,这是一个伪造的副本。 why 像 PDO
这样的全局类或像 strlen
这样的全局函数需要设置为绝对路径 `\` 以得到认可。它不能解决全局和本地范围,也不能解决 manual 中未写的任何其他有用的问题 这个问题是合法的,并询问为什么必须使用反斜杠,而不是命名空间如何工作,OP 显然掌握了 80%理论。
【参考方案1】:
有时在框架控制器或模型(如 ZF2、Laravel)中使用反斜杠来指定您希望使用 PHP 原生类而不是框架类
【讨论】:
【参考方案2】:据我了解,这与类声明在文件结构中的位置有关。如果您在自定义类的文件夹中工作,例如专用于留言簿的文件夹,并且您在留言簿文件夹中,您可能希望访问您经常使用的类,在许多情况下是像 PDO 或MySQLi。这些将存储在根目录中,因此您需要告诉 PHP 在哪里查找文件。
所以,假设您的文件结构类似于:
根 - 留言簿 - 论坛 - 存储物品
您正在处理 Store items 目录,但想要访问根目录中的 PDO 处理程序,因此您可以通过声明它来访问它: $conn = 新 \PDO;
同样,假设您在论坛部分并想从商店中提取信息,您只需像这样访问它: $item = 新的\Store\StoreItem;
至少……我认为是这样的!如果您正在使用本地声明的所有类,则无需过多担心目录结构。
【讨论】:
这与目录结构无关。这是关于命名空间嵌套的。以上是关于启动对象时类类型前的反斜杠[重复]的主要内容,如果未能解决你的问题,请参考以下文章