在 PhpStorm 中找不到 PDO class

PDO class could not be found in PhpStorm

所以,这是我项目中的一些代码。最近开始使用 PDO 方法连接到数据库等。问题是我正在使用的 IDE (PhpStorm) 由于某种原因无法找到任何 PDO class是的。 PhpStorm 只是在单词下方显示一条黄线并表示 'Undefined class PDO'。

奇怪的是,如果我在单词 PDO 前加上一个 \,(即 \PDO),那么现在可以找到 class。我知道,通过一些研究,您可以像这样 use \PDO 那样包含它,但我真的不想这样做。

最后,想提一下 PhpStorm 的外部库中包含 PDO,这更加令人困惑,但希望你们能够帮助我解决这个问题。

EDIT - Answer

好的,在一些帮助之后我找到了为什么我会遇到这个问题。在这个文件的顶部我有 namespace App\DB; 因为这个 Php 无法找到 PDO class。所以,实际上在前面放一个\实际上是正确的做法。

非常感谢 IMSoP、tete0148、Jim Wright。

只需在 class 名称前添加一个反斜杠,因为 PHP 标准 classes 位于根命名空间中。

\PDO
\PDOException

或者在文件顶部添加 use 语句。

use \PDO;
use \PDOException;

请注意,PHPStorm 可以在光标位于警告上方时按 alt+enter 自动导入 classes。

@yann-chabot(已删除)的回答是正确的,如果您在 class 之前添加 \,它会起作用,但他不清楚为什么。

在PHP中,反斜杠用于确定命名空间,PDO class在根命名空间中。

如果您与另一个class处于同一个命名空间,则使用时无需指定命名空间。否则,您应该指定命名空间。

将命名空间视为文件夹的一种简单方式。

有关详细信息,请参阅 PHP manual

我认为你已经得出结论 PHPStorm 告诉你的是错误的,但实际上你需要学习 how namespaces in PHP work

  • 向 class 名称添加前导反斜杠是引用其绝对命名空间路径的一种方式。
  • 在这种情况下,PDO classes 位于根命名空间中,因此它们只是 \PDO 等;如果它们位于名为 Acme\Widgets 的命名空间中,您可以将 \Acme\Widgets\PDO 写为完全限定的 class 名称。
  • 如果您正在编写的文件本身在特定命名空间中声明代码,那么像这样完全限定名称是必要的;也就是说,如果文件顶部有 namespace 关键字。在这种情况下,裸名 PDO 被假定为 class 在您正在编写代码的同一名称空间中 。如果您的文件以 namespace ZOulhadj\DB 开头,那么 new PDO 将被展开,就好像您写的是 new ZOulhadj\DB\PDO.
  • 如果是这样的话,不只是PHPStorm找不到class——PHP本身也会找不到[=34] =]. PHPStorm 向您指出一个错误,因此您可以在 运行 代码之前修复它。