PHP项目遇Intelephense(1006)错误:期望类型'object',实际为'void'求解决
解决Intelephense(1006) "Expected type 'object'. Found 'void'" 错误
错误原因
这个错误来自静态代码分析工具Intelephense的类型推断问题:
- 类属性
$connect没有显式类型声明,工具无法确定它的具体类型 mysqli_connect()连接失败时会返回false而非对象,导致类型不确定logIn方法里的$this->c onnect存在多余空格,属于语法错误,进一步干扰了工具的类型分析
修复步骤
给属性添加类型声明
为$connect明确声明类型,PHP 8.0+支持联合类型,可声明为public mysqli|false $connect;,也可用可空类型public ?mysqli $connect;(表示允许为null或mysqli对象)。给方法添加返回类型声明
给dbConnect方法添加返回类型,让Intelephense明确知道它的返回值类型。修复语法错误
修正logIn方法中$this->c onnect的多余空格,改为$this->connect。增加连接有效性校验
在各数据库操作方法中先判断$connect是否有效,避免后续调用mysqli函数时传入非对象值。
修改后的完整代码
class DataBase { // 明确声明$connect的类型 public mysqli|false $connect; public $data; private $sql; protected $servername; protected $username; protected $password; protected $databasename; public function __construct() { $this->connect = null; $this->data = null; $this->sql = null; $dbc = new DataBaseConfig(); $this->servername = $dbc->servername; $this->username = $dbc->username; $this->password = $dbc->password; $this->databasename = $dbc->databasename; $this->dbConnect(); // 可选:连接失败时直接终止并输出错误 if (!$this->connect) { die("数据库连接失败: " . mysqli_connect_error()); } } // 添加返回类型声明 function dbConnect(): mysqli|false { $this->connect = mysqli_connect($this->servername, $this->username, $this->password, $this->databasename); return $this->connect; } function prepareData($data) { if (!$this->connect) { return false; } return mysqli_real_escape_string($this->connect, stripslashes(htmlspecialchars($data))); } function logIn($user, $username, $password) { if (!$this->connect) { return false; } $username = $this->prepareData($username); $password = $this->prepareData($password); $this->sql = "select * from " . $user . " where username = '" . $username . "'"; $result = mysqli_query($this->connect, $this->sql); if (!$result) { return false; } $row = mysqli_fetch_assoc($result); $login = false; if (mysqli_num_rows($result) != 0) { $dbusername = $row['username']; $dbpassword = $row['password']; if ($dbusername == $username && password_verify($password, $dbpassword)) { $login = true; } } return $login; } function signUp($user, $fullname, $email, $username, $password) { if (!$this->connect) { return false; } $fullname = $this->prepareData($fullname); $username = $this->prepareData($username); $password = $this->prepareData($password); $email = $this->prepareData($email); $password = password_hash($password, PASSWORD_DEFAULT); $this->sql = "INSERT INTO " . $user . " (fullname, username, password, email) VALUES ('" . $fullname . "','" . $username . "','" . $password . "','" . $email . "')"; return mysqli_query($this->connect, $this->sql) ? true : false; } }
额外提示
- 建议使用预处理语句替代字符串拼接SQL,彻底避免SQL注入风险,比如使用
mysqli_prepare和bind_param方法。 - 升级到PHP 8.0+可以获得更完善的类型支持,让静态分析工具的推断更准确。
内容的提问来源于stack exchange,提问作者reza
相关产品推荐
相关产品推荐

