0

我有以下代码,我无法解释为什么它会输出错误。

class User extends mysqli{

    // property declaration
    private $server;
    private $user;
    private $pass;
    private $database;
    private $conn;

    function __construct($server, $user, $pass, $database){

        $mysqli = new mysqli($server, $user, $pass, $database);
        if ($mysqli->connect_errno) {
            echo "Connect failed: ". $mysqli->connect_error;
            exit();
        }

        $this->conn = $mysqli;

        return 0;

    }

    function __destruct(){

        $conn = $this->conn;
        $conn->close();

    }
}

和主要代码

include("global_config.php");

require "User.php";

$u = new User($con['server'],$con['user'],$con['pass'],$con['db']);

$u->query("SELECT * FROM users");

返回此错误

Warning: mysqli::query() [mysqli.query]: Couldn't fetch User in E:\Xampp\htdocs\testphp\testMysql.php on line 9

通常,它应该表现得像这里的PHP 继承,使用子变量的父函数

但它没有

我已经用尽了我的想象力来思考我可以用于谷歌搜索的最可能的关键字

有任何想法吗?

4

1 回答 1

4

您做错的第一件事是您的 User 对象扩展了 mysqli 对象并且它们没有类似的东西。继承是“IS A”关系。为了让您的 User 对象使用 Mysqli 对象,您需要“HAS A”关系。这也称为合成。

如果您使用继承,则不要使用组合,因为您不需要同时使用两者。在这种情况下,继承是错误的选择。

如果您想通过 Mysqli 授予 User 对象访问数据库的权限,您需要在 User 对象中包含 Mysqli 对象。

实现这一目标的最佳方法是拥有两个对象,一个代表 Mysqli,另一个代表 User。

您的 User 类可能如下所示:

class User 
{
    private $user;
    private $pass;
    private $db;

    function __construct($db)
    {
        $this->db = $db;
    }
}

你会像这样使用它:

$db = new mysqli($server, $user, $pass, $database);
$user = new User($db);

现在用户可以访问 Mysqli 对象并且可以与数据库交互。

现在更进一步,您可以创建自己的小型数据库抽象层,该层将包含 mysqli 和 mysqli stmt 对象,并且您可以拥有执行 CRUD 的函数。然后,您可以将该数据库抽象层对象传递给您的 User 对象,这样您将更加强大。

并且不要使用 exit() 函数,只需使用 return 来停止函数。我确切地知道你现在正在经历什么 :) 阅读这篇文章: http: //phpmaster.com/liskov-substitution-principle/ 并通过示例了解为什么组合比继承更好。

祝你好运!

于 2012-11-07T19:25:55.473 回答