PHPStorm:尽管在PHP中成功地使用了require();,但仍未定义变量

我有一个connect.php文件,应该是用来验证与我的数据库的成功连接。然后我有一个 db.php 文件,我在其中使用 PHP 中的 require('connect.php'); 函数导入了 connect.php 文件。然而,我的IDE仍然给我一个错误,说$conn变量(在下面的代码中定义)没有被定义。起初我以为将connect.php导入db.php文件的过程可能在某种程度上失败了,但情况似乎并非如此,因为在浏览器中启动db.php文件会返回 “数据库连接成功”,这应该是不可能的,除非connect.php文件已被正确导入。

这就是connect.php文件的内容。

<?php

$host = 'localhost';
$usr = 'root';
$passwd = '';
$db_name = 'testdb';

$conn = new MySQLi($host, $usr, $passwd, $db_name);

if($conn->connect_error){
    die('Database connection failure: ' . $conn->connect_error);
} else{
    echo "Database connection success.";
}

然后我尝试将这段代码导入db.php,如下图所示。

<?php

require('connect.php');

$sql = "SELECT * FROM users";
$stmt = $conn->prepare($sql);

然而在db.php中,$conn的变量由于某种原因而未被定义。为什么在导入它的定义成功的情况下,它还是未定义?

解决方案1

在PHPStorm中,如果我错误地定义了项目根(即使这不应该是你的情况)或包含路径,这种情况就会发生在我身上。

基本上,IDE无法 “看到 “connect.php里面的内容,因此就像那里定义的变量不存在一样。

你可以尝试定义一个class来处理连接。这是个肮脏的黑客。

<?php
    class MyConnection
    {
        private static $conn = null;

        public static instance() {
            if (null === static::$conn) {
                $host = 'localhost';
                $usr = 'root';
                $passwd = '';
                $db_name = 'testdb';
                static::$conn = new MySQLi($host, $usr, $passwd, $db_name);
                if(static::$conn->connect_error) {
                    die('Database connection failure: ' . static::$conn->connect_error);
                }
            }
            return static::$conn;
        }
    }

中,然后在db.php中。

require('connect.php');

$sql = "SELECT * FROM users";
$stmt = MyConnection::instance()->prepare($sql);

不同的是,我注意到一些IDE(PHPStorm和Microsoft VSCode)有时似乎比全局符号更能处理类way

这种方法的优点之一是,在较大的项目中,如果你定义了一个自动加载器,就可以完全避免大多数requireinclude,而只在需要时加载文件。

在这种情况下,这只是一个丑陋的黑客,perhaps让IDE高兴。如果你可以通过告知 IDE 你的项目文件和/或包含的路径来解决一些问题,通过各种方式,你应该这样做。

我将避免使用声明的技巧

global $conn;

因为当你使用一个全局未定义的变量时,你可能不会注意到,或者更糟糕的是用特殊的注释来压制警告,因为这使你错过了all个未定义的符号。

/** @noinspection PHPUndefinedSymbol */

如果没有别的办法,就投降吧,定义一个假的变量。

/* dummy connection */
$conn = null;

require 'connect.php';

...

 

点赞