我有以下代码,我无法解释它输出错误的原因。
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 inheritance, parent functions using child variables
一样但它没有
我已经用尽我的想象力思考我可以用于谷歌搜索的大多数可能的关键词
任何想法?
答案 0 :(得分:4)
你做错的第一件事是你的User对象扩展了mysqli对象并且他们没有类似的东西。继承是“IS A”的关系。并且对于您的User对象使用Mysqli对象,您需要“HAS A”关系。这也称为组合。
如果您正在使用继承,那么不使用合成,因为您不需要同时使用它们。在这种情况下,继承是错误的选择。
如果要通过Mysqli为User对象提供数据库访问权限,则需要在User对象中包含Mysqli对象。
获得两个对象的最佳方法是,一个代表Mysqli,另一个代表用户。
您的用户类可能如下所示:
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/ 并通过实例来理解为什么组合比继承更好。
祝你好运!